因為需要用到json數據格式,上網查了一下例子之后我就想本地測試一下看能不能成功。
結果,chrome下沒有任何反應,打開控制台之后報錯如下:
XMLHttpRequest cannot load file:///E:/project/info.json. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
查了一下資料發現,這似乎是Ajax跨域問題。
什么叫跨域?
首先我們應該知道在JavaScript的安全性上,有一條很重要的安全限制,叫“同源策略”。就是一個腳本只能讀取與它同源(如由同一個主機下載,通過同一個端口下載或者下載協議相同)的窗口或者文檔的屬性。
這種限制是很有必要的,如果沒有這種限制,窗口中的不可靠腳本就可以用DOM方法讀取瀏覽器窗口的內容,而窗口中可能會含有私有信息。
跨域的意思,顧名思義,跨是跨越,域就是別的服務器,跨域其實就是去別服務器上取東西。 只要協議、域名、端口有任何一個不同,都被當作是不同的域
然后問題來了,我這是本地測試啊,跨什么域?繼續查資料。
查出來的結果是Chrome在讀取本地相對路徑腳本時,禁止向第三方請求數據。chrome的安全機制限制了本地文件的xhr請求。
好吧,於是我把整個項目放上github,github page上顯示正常,我的問題倒是解決了。
關於Ajax跨域的問題,有興趣的還可以看一下這份文檔:How to run things locally
接下來我順手測試了一下別的瀏覽器本地文件跨域,結果:
Firefox:沒有任何安全提示與確認,跨域成功。
IE11:默認會提示加載不安全activex控件,要求確認,確認之后跨域是OK的。
:(