簡體   English   中英

IE9 JQuery.ajax引發神秘錯誤

[英]IE9 JQuery.ajax throws mystery error

我在IE9中遇到困難的Ajax錯誤。 我會先說,從技術上講,這不是跨域請求,所以我確定這不是問題。

編輯 :看來問題可能與同域請求被視為跨域請求有關,盡管不清楚原因(請參閱注釋)。

我正在使用本地代理發出跨域Ajax請求,並且我使用的url看起來像http://localhost/proxy/?target=.....所有好的瀏覽器都對此感到滿意,但是IE會立即返回一個甚至在分派請求之前發生錯誤(我已經使用Fiddler和IE的開發人員工具網絡捕獲驗證了這一點)。

當我檢查傳遞給JQuery的ajax.error回調的錯誤對象時,其isRejected()函數返回true,但是我無法確定導致請求被拒絕的原因。 錯誤對象的readyState為4(表示請求已完成?),狀態為0,statusText為“錯誤”。

我正在建立這樣的請求:

$.ajax(url, {
    data: {...list of parameters...},
    dataType: 'json',
    type: 'GET',
    success: function() { ... },
    error: function() { ... },
    beforeSend: proxy.beforeRequestSend,
    timeout: 35000
});

proxy.beforeRequestSend函數如下所示:

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    // I've also tried using the full url (http://localhost/proxy/?...)
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
  }
};

有誰知道會導致請求在IE9中完全失敗的原因? 不幸的是,我無法訪問IE8或7進行測試,但我認為它們的行為相同。 調用JQuery的ajax錯誤處理程序的事實表明,在構建請求時不會發生錯誤,但是應該在執行該錯誤時發生。 所有其他瀏覽器都正常工作,這告訴我基本原理是正確的。

我以前曾讀過JQuery / IE組合在對某些字符進行url編碼時that.proxyRequired(settings.url)問題,但是如果我在beforeSend函數末尾警告settings.url ,則目標URL已正確編碼(這也告訴我that.proxyRequired(settings.url)返回true)。

任何輸入非常感謝。

在您的JavaScript中,在調用$ .ajax(或等效方法)之前,強制跨域行為:

JQuery.support.cors=true;

您的代理動作是否發送重定向以響應ajax調用? 瀏覽器無聲地跟隨重定向,這可能是XHR檢測XSS嘗試的原因。 由於jQuery在IE9上不支持CORS,因此您會遇到錯誤。

參見另一個Stackoverflow問題: 跨域Ajax請求在Opera和IE9中不起作用?

正如您在我的問題的代碼中看到的那樣,我在JQuery.ajax函數的proxy.beforeRequestSend回調( proxy.beforeRequestSend )中添加了代理URL。 到該函數執行時,JQuery已經檢查了請求並確定它是跨域的。

結果,JQuery將我所有的請求都視為跨域,即使它們都去了本地代理。 然后,JQuery拒絕了IE和Opera中的任何跨域請求,因為它們不支持CORS。

幸運的是,crossDomain屬性被傳遞到settings對象中的beforeSend回調,並且可以輕松更改。

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url);
    settings.crossDomain = false;
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM