2010-01-26 77 views
10

我開發的意思是運行無論是從Web服務器(通過HTTP)或文件系統中的JavaScript應用//網址。讀取文件:(:// URL上的文件),在IE瀏覽器的XMLHttpRequest

由於該代碼的一部分,我需要使用XMLHttpRequest在相同的目錄頁,在頁面的子目錄加載文件。

此代碼工作正常(「PASS」)時,Web服務器上執行,但是當運行關文件系統在Internet Explorer 8中不能正常工作(「失敗」):

<html><head> 
<script> 
window.onload = function() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", window.location.href, false); 
    xhr.send(null); 
    if (/TestString/.test(xhr.responseText)) { 
    document.body.innerHTML="<p>PASS</p>"; 
    } 
} 
</script> 
<body><p>FAIL</p></body> 

當然,起初它失敗了,因爲在文件系統上根本沒有腳本可以運行;系統會提示用戶黃色條,警告:「爲了幫助保護您的安全,Internet Explorer已限制此網頁運行可以訪問您的計算機的腳本或ActiveX控件。」

但甚至一度我點擊欄和「允許阻止的內容」頁面仍然失敗;我在xhr.open調用中收到「訪問被拒絕」錯誤。

這讓我爲難,因爲MSDN說,「爲發展宗旨,在file://協議從本地計算機區域允許的。」這個本地文件應該是本地計算機區域的一部分,對吧?

我怎樣才能得到這樣的代碼工作?我很好地提醒用戶安全警告;我強迫他們關閉控制面板中的安全措施並不好。

編輯:我沒有,事實上,加載一個XML文檔在我的情況;我正在加載一個純文本文件(.txt)。

+0

你嘗試過var xhr = new ActiveXObject(「MSXML2.XMLHTTP」); (請參閱下面的答案)?這不應該侷限於XML文件。但它將僅限於IE。 – Don 2010-01-26 20:43:31

+0

FWIW,我在Chrome中遇到同樣的問題,基本上是一樣的。 – apollodude217 2013-01-24 15:36:52

回答

7

嗯,這可能是本機XMLHttpRequest對象和該ActiveX之間的差異?我似乎記得有關此事的一些事情。也就是說,不是

var xhr = new XMLHttpRequest(); 

嘗試

var xhr = new ActiveXObject("MSXML2.XMLHTTP"); 

顯然,把一些檢查到位,看瀏覽器是否支持ActiveX。當然,這也僅限於IE。

+0

仍然在IE10中獲得拒絕權限 – FlavorScape 2013-05-30 22:45:52

+0

ummmm是SCRIPT5:訪問被拒絕。同樣的錯誤來了:( – 2015-02-10 07:04:14

+0

很喜歡這個答案,謝謝 – 2016-05-03 04:34:48

6

我剛碰巧碰到同樣的問題。如上所示,非本地的ActiveX「構造函數」起作用。我不確定是否有不同的政策適用於這兩個對象,但由於jQuery也提到了同樣的問題,它可能是一個真正的錯誤。下面是從jQuery源相關的代碼(1.4.2,行4948):

// Create the request object; Microsoft failed to properly 
// implement the XMLHttpRequest in IE7 (can't request local files), 
// so we use the ActiveXObject when it is available 
// This function can be overriden by calling jQuery.ajaxSetup 
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 
    function() { 
     return new window.XMLHttpRequest(); 
    } : 
    function() { 
     try { 
      return new window.ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e) {} 
    } 
+0

啊,這就解釋了爲什麼當我們使用.load方法時,升級jQuery過去v1.11.1導致了IE11在工作時出現權限問題,我想jQuery剛剛停止檢查這個版本 – calculuswhiz 2018-03-08 04:22:19

6

如何我能得到這樣的代碼工作?

如上所述,這看起來像是Microsoft XMLHttpRequest中的一個故障。 jQuery的(2011年7月)還寫道: -

微軟未能正確地實現在IE7中的XMLHttpRequest(不能請求本地文件)

我確認這失敗了IE8了。

如果XMLHttpRequest不起作用,解決方案是使用new window.ActiveXObject("Microsoft.XMLHTTP")作爲本地文件。

的失敗是在xhr.open行,以便它可以在那裏抓到,然後嘗試ActiveXObject如下: -

var xhr = new XMLHttpRequest() 
try { 
    xhr.open('GET', url, true) 
} 
catch(e) { 
    try { 
     xhr = new ActiveXObject('Microsoft.XMLHTTP') 
     xhr.open('GET', url, true) 
    } 
    catch (e1) { 
     throw new Error("Exception during GET request: " + e1) 
    } 
} 

該代碼將至少使用標準XMLHttpRequest爲IE9(未經測試)和未來的IE瀏覽器,如果/當微軟修復錯誤。使用上面的jQuery代碼,只要ActiveXObject可用,即使微軟修復該錯誤,也將使用非標準Microsoft.XMLHTTP

+0

無法正常工作IE10中的新ActiveXObject('Microsoft.XMLHTTP')仍然被拒絕權限 – FlavorScape 2013-05-30 22:37:03

+0

在工作中也遇到了這個問題,顯然,本地文件甚至IE11的XMLHttpRequest失敗。也許他們在Edge中做過,我不知道。ActiveXObject至少可以工作。 – calculuswhiz 2018-03-08 04:14:13