2011-03-09 39 views
6

我正在通過一個IE插件注入到每個頁面上的iframe發出一個ajax請求。我使用IE的cross domain request,因爲jQuery的ajax在IE中失敗。這對IE8的75%時間工作& 9.其他25%,xdr.onload甚至沒有火災。來自IE的ajax(XDR)響應不一致

服務器php正在做它的工作......當onload確實不會觸發時,日誌看起來完全相同。而且,xdr.onerror也不會觸發。

任何想法?

 thisURL = "http://example.com/getmsg.php?cmd=getMessage&iid=ddeb2c1228&uurl=http%3A%2F%2Fwww.cnn.com%2F&t=" + Math.random(); 

     // Use Microsoft XDR 
     var xdr = new XDomainRequest(); 
     xdr.open("GET", thisURL); 
     xdr.onload = function() { 
      // this is sometimes called, sometimes not in IE 
      alert('INCONSISTENT ALERT'); 
      callback(xdr.responseText); 
     }; 
     xdr.send(); 
+1

只是一個隨機猜測:你可以嘗試添加一個無用的參數到URL的末尾,以確保瀏覽器繞過它的緩存......如果它發生在我身上,我會自己嘗試,但是你可能不會有興趣浪費時間完成猜測:-) – Pointy 2011-03-09 18:17:15

+1

...或者只是使用'POST',它根本不會被緩存。另外,我會綁定'xdr.onerror ='來查看是否會觸發。不幸的是,XDR錯誤沒有錯誤描述。另外,請確保''Access-Control-Allow-Origin'標頭設置爲'*' – jAndy 2011-03-09 18:19:26

+0

@Point,t實際上是math.random ...我編輯了我的答案。這是一個很好的猜測。這不會被緩存,雖然 – Kyle 2011-03-09 18:35:56

回答

4

發現了問題,最後一分鐘的基於標準的行爲(;-))。在我的情況下,我需要指定一個超時值,即使請求沒有超時。爲了正確調試XDR問題,我建議使用下面的代碼,每個警報都會告訴你代碼的情況。正如我所說,在我的情況下,這是一個失蹤的timeout聲明。但是,下面的代碼應該調試任何XDR問題:

 var xdr = new XDomainRequest(); 
      if (xdr) { 
       xdr.onerror = function() { 
//     alert('xdr onerror'); 
       }; 
       xdr.ontimeout = function() { 
//     alert('xdr ontimeout'); 
       }; 
       xdr.onprogress = function() { 
//     alert("XDR onprogress"); 
//     alert("Got: " + xdr.responseText); 
       }; 
       xdr.onload = function() { 
//     alert('onload' + xdr.responseText); 
        callback(xdr.responseText); 
       }; 
       xdr.timeout = 5000; 
       xdr.open("get", thisURL); 
       xdr.send(); 
      } else { 
//    alert('failed to create xdr'); 
      } 
+1

謝謝 - 我錯過了超時 - 它似乎有一個默認值0! – 2012-08-29 02:36:25

+0

如果它幫助任何人,我只是與我的應用程序的IE9 XDR請求作鬥爭,並且我發現當您調用open()方法(通過手動構建並檢查控制檯中的XDomainRequest對象)時,超時會重置。在調用open方法之後,我設置了超時之前,我得到了隨機故障。 (如果重要的話,我仍然會事先設置它)。 – Andrew 2013-01-22 19:56:09

0

這裏很難給出明確的答案。

首先,您應該嘗試使用Fiddler來查看您是否遇到某種網絡故障。它將幫助您瞭解請求是否已實際完成以及服務器的響應。

其次,我不知道這是否適用,我們最近在IE上遇到了跨域問題。該代碼在其他瀏覽器中運行良好 - Firefox,Safari和Chrome。這種情況下的問題證明,請求返回了預期的404。無論如何,IE停止了所有的執行,即使我們對404事件的錯誤處理從未被解僱。所以,你可能會在這裏得到一些相同的結果。 Firefox,Safari等都讓腳本繼續。如果您返回錯誤,則可能希望使用錯誤值返回成功。

+0

我們測試了網絡故障。這並不是說。並且沒有返回404。所有資源都被找到。 – Kyle 2011-03-19 20:37:18

0
  • 首先,添加一個onerror處理程序來調試你的東西。記錄他們,看看究竟發生了什麼。
  • 其次,你的'數學隨機'的方法是有缺陷的。更好的選擇是使用新的Date()。getTime(),這將確保您在時間流逝時獲得唯一的請求。
  • 三,你可以(也許應該)使用POST方法來繞過IE顯然
9

我有一個非常類似的問題:XDomainRequests只有一些失敗的時候,儘管提琴手顯示正在發送的所有請求和響應頭正是我打算。我已經定義了這些XDR對象上的每個事件處理程序和超時屬性,並且沒有任何處理程序正在被調用。 F12開發人員工具顯示請求已中止。 GET和POST都可以中止到多個不同的域,但第一個請求總是成功的。

然後我試圖把呼叫xdr.send在超時,如下所示:

setTimeout(function() { 
    xdr.send(); 
}, 0); 

和它的工作。我不知道爲什麼,但也許這會對別人有幫助。

7

在這裏命名標題是正確的。經驗相當不一致。讓我們通過它...

var xdr, err, res, foo, url; 

xdr = new XDomainRequest(); 

err = function(){ alert("There was an error, operation aborted"); } 
res = function(){ alert("Success! " + xdr.responseText); } 
foo = function(){ return; } 

url = "http://hello.com/here/is/the/url/?query=true&whatever=asd"; 

xdr.onerror = err; 
xdr.ontimeout = foo; 
xdr.onprogress = foo; 
xdr.onload = res; 
xdr.timeout = 5000; 

xdr.open("get", url); 
xdr.send(null); 

XDomainRequest對象在每個IE中處理方式不同。

在IE9中 - > XDomainRequest對象要求所有句柄都有一個方法。這意味着,像onerror,onload,ontimeout和onprogress這些句柄都可以做。沒有定義這些句柄的方法,那麼你會得到一個「操作中止」的網絡響應。

在IE7/8/9中 - 默認情況下XDomainRequest是ASYNC。無論xdr對象是否完成,它都會沿着堆棧進一步執行代碼。 setTimeTimeout可能是一個解決方案,但不應該。

在這種情況下,觸發一個事件並在執行任何進一步的代碼之前監聽事件。一個例子(在jQuery中)...

// call this method in xdr onload 
$(document).trigger("xdr_complete"); 

// use this wrapper in code you want to execute after the complete of xdr 
$(document).bind("xdr_complete", function(){ ... }); 

在IE7/IE8中,你會注意到它的工作原理。 IE7和IE8相當「鬆散」,因爲它們在句柄缺少方法時不會中止。

+0

不能相信,但設置所有回調確實爲我解決了問題。這是記錄在某處嗎? – 2014-04-30 11:18:44