2010-04-17 13 views
3

我試圖在IE8中創建一個AJAX請求。IE8的AJAX獲取setRequestHeaders不工作,除非在URL中提供的參數

var xhr = new ActiveXObject('Msxml2.XMLHTTP'); 
xhr.open('GET', '/ajax/'); 
// Required header for Django to detect AJAX request 
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
xhr.onreadystatechange = function() { 
    if (this.readyState == 4) console.log(this.responseText); 
} 
xhr.send(null); 

這在Firefox,Chrome,Safari中運行得非常好。然而,在IE8中,我的所有AJAX測試請求都工作,除了我正在執行GET而沒有任何查詢字符串參數(如上面的那個)之外。的POST工作,毫無疑問,GET請求只每當我在URL中包含查詢字符串,像這樣的工作:

xhr.open('GET', '/ajax/?foo=bar') 

我也110%肯定,我的服務器代碼進行適當處理這些請求,因此,這個樹樁我完全。

有沒有人有任何線索可能會導致此?

+0

我知道它可能不是你要找的答案,你爲什麼不使用jQuery?它承擔了您所有瀏覽器兼容性的責任。所以,請試試看。它也不會改變你的代碼。 :) – Bipul 2010-04-17 06:33:34

+0

你有沒有嘗試過使用類似wireshark的東西來確定IE是否發出HTTP請求呢?也就是說,你確定瀏覽器沒有確定「嘿,我甚至不需要運行HTTP請求,因爲我已經在緩存中找到了這個URL!」 – Pointy 2010-04-17 10:15:52

+0

@Pointy - 確保清除緩存並在任何更改後重新啓動服務器。 @Bipul - 我在寫我自己的框架,但我喜歡jQuery =) – ground5hark 2010-04-17 15:21:03

回答

0

該標準規定GET請求具有(a)查詢參數。我的猜測是,MSIE8在這種情況下的行爲恰當,其他瀏覽器「讓它滑動」。

如果你的意圖是加載一個頁面,你可以發送一個GET請求到一個文件,然後包括/ freads /無論內容文件並將其發回。在這種情況下,您將擁有一箇中間文件,其中包含任何頁面作爲參數發送(例如,?foo=bar)。

無論如何,我會使用jQuery來選擇corrent HTTP對象,否則您將不得不做這樣的全面兼容性:

var XMLHttpArray = [       
    function() {return new XMLHttpRequest();}, 
    function() {return new ActiveXObject("Msxml2.XMLHTTP");}, 
    function() {return new ActiveXObject("Msxml2.XMLHTTP");}, 
    function() {return new ActiveXObject("Microsoft.XMLHTTP");}  
]; 

function XMLHTTPObject(){ 
    var xmlhttp = false; 
    for(var i=0; i<XMLHttpArray.length; i++){ 
      try{ 
        xmlhttp = XMLHttpArray[i](); 
      }catch(e){ 
        continue; 
      } 
      break; 
    } 
    return xmlhttp;  
}; 

var http = XMLHTTPObject(); 
http.open(...);