2017-01-20 92 views
1

請告訴我,爲什麼本地javascript無法打開本地文件? 我試圖創建一個簡單的JavaScript/HTML應用程序,應該從本地文件系統在本地機器上運行。這個應用程序試圖讀取配置文件中使用不同的方法(JSON),但得到以下錯誤(鉻):本地javascript無法打開本地文件

  1. 在XMLHttpRequest的情況下,方法open("GET", filename, true)拋出一個異常:

    的XMLHttpRequest無法加載文件:/// bla-bla-bla。協議方案僅支持交叉源請求:http,data,chrome,chrome-extension,https,chrome-extension-resource。

  2. document.createElement("iframe").src=filename情況下,我有另一個異常:

    VM596:1未捕獲的拋出:DOMException:未能讀取從 'HTMLIFrameElement' 的 'contentDocument' 屬性:被阻止與原籍 「空」 幀從訪問跨域框架。」

  3. var f=new File([], filename, { type: "text/plain" });情況下,我已經得到了與零的大小,並在所有沒有錯誤的文件對象。的FileReader返回一個空的結果,那麼,

所以,我的問題是: 爲什麼它是「跨源」?這些文件存儲在同一個目錄中! 我怎麼能打開來自我運行該腳本相同的來源/目錄的本地文件? 請幫忙。

P.S .:是的,我知道--allow-file-access-from-files,但我需要由客戶運行此。

+2

'file://協議真的有一個非常有限的用法,用於測試或查看一個單獨的文件。對於真正的webapp測試,你需要建立一個小型的,基本的「web服務器」程序,它可以向'localhost/index.html'或'localhost/bla-bla-bla.js'發送請求。例如,Python可以讓你通過命令行在python -m SimpleHttpServer 80上設置一個文件夾 – Katana314

+0

@BbIKTOP,tou可以將JSON文件轉換成一個javascript文件(將'var myVariable ='添加到開頭json文件),然後使用''將數據包含在'myVariable'(對象)中。雖然不是最好的解決方案,但可行。 –

+0

他們有更多的100個沒有局域網,運行非常具體的軟件(健身房),這個應用程序旨在顯示一些廣告videoclips。 這就是爲什麼它不可能與web服務器一起使用這樣一個明顯的解決方案,這就是爲什麼我在這裏問這個問題。 當然,可以不使用json配置,而是將配置放入代碼中,也許放在單獨的文件中。這並不有趣,因此無需在此處詢問或討論。 – BbIKTOP

回答

1

你可以做什麼來閱讀你的。json文件,就是將其聲明爲.js。

data.js

var data = `{"value1": 10, "value2": "hello"}` 

的index.html

<script src="data.js"></script> 

<script> 
    console.log(JSON.parse(data)) 
</script> 

這將打印

Object {value1: 10, value2: "hello"} 

他們都必須在同一目錄下,否則你必須改變我數據的一部分

+0

爲什麼我可以把它放在同一個文件中,爲什麼我需要使用data.js? 就像 ' ' – BbIKTOP

+0

@BbIKTOP因此,您將您的數據與源代碼分開。這個想法是使用data.js作爲假設的data.json。如果您必須將「v2」值更改爲3,則無需打開源代碼。 –

+0

這將是代碼,而不是數據 – BbIKTOP

4

爲什麼它是「交叉來源」?這些文件存儲在同一個目錄中!

由於Chrome認爲所有file://網址是跨源到彼此。

我怎麼能從同一個來源/目錄打開本地文件我運行腳本?

從Chrome?你沒有。除非你完全使用命令行選項來禁用CORS(這是一個糟糕的主意,因爲它很容易忘記你已經設置了命令行選項並上網衝浪,讓你自由開放以利用事實上你已經禁用網絡安全)。

其他瀏覽器可能會以不同的方式處理原產地null

相反,運行本地Web服務器並通過本地Web服務器使文件可用。然後你可以訪問它們,因爲它將是一個同源的http URL,而不是file的URL。或者使用任何可以讓你用JavaScript編寫應用程序的十幾種框架(而不是使用瀏覽器)。或者提供一個簡單的NodeJS腳本來提供這些文件(大約10行)。等等

+0

所有「文件」都是交叉元素?非常聰明和聰明的設計))))))) 所以,沒有辦法讓這樣的應用程序? 當然,我有一臺服務器,並明白如何用服務器做到這一點,這很簡單,但問題是,沒有它,是否有可能實現這一目標。將Web服務器安裝在任何他們需要運行這個垃圾的嵌入式PC上是不真實的。而這些電腦根本沒有連接到網絡。 – BbIKTOP

+0

@BbIKTOP:我回答了這個問題:你不能。 (並且Stack Overflow上的髒話不好)使用任何一種「用JavaScript創建應用程序」解決方案。讓你的系統使用Node。或者其他十幾種類似的解決方案。 –

+1

@BbIKTOP PC未連接到網絡的事實是無關緊要的。這個想法是在應用程序進程期間運行嵌入式Web服務器。它應該在應用程序關閉時停止服務,因爲它是應用程序的一部分,而不是網絡中其他位置的另一臺服務器。你會使用80以外的端口,因爲你並不是真的想要上網。參見例如:http://stackoverflow.com/questions/3001185/what-is-the-recommended-way-of-running-a-embedded-web-server-within-a-desktop-ap – ThisClark