4

我有一個關於Prototype在IE瀏覽器中處理CORS的問題< 10.我注意到對Ajax.Request調用交叉源URL會失敗在IE9中默默無聞地檢查服務器的訪問日誌,很明顯這個請求從未被製作過。Ajax.Request在IE8/9中無法與CORS一起工作,無法正常運行

經過一番閱讀似乎IE8/9必須使用自己的XDomainRequest對象,以使CORS,但原型的Ajax.getTransport函數返回XMLHttpRequest對象,我明白不允許在IE8/9 CORS?

I have found a patch for jQuery對於同一個問題,這告訴我這也可能是Prototype的問題,我只是找不到任何發佈的東西。

我實現了一個有點哈克修復:

if (window.XDomainRequest) { 
    // Use Microsoft XDR for IE8 and IE9 
    var xdr = new XDomainRequest(); 
    xdr.open('POST', url); 
    xdr.onload = function() { 
     var data = xdr.responseText.evalJSON(); 
     callback_handler(data.domain); 
    }; 
    setTimeout(function(){ 
     xdr.send(); 
    }, 0); 
} else { 
    new Ajax.Request(url, 
     { 
      method: 'post', 
      onSuccess: function(response) 
      { 
       var data = response.responseText.evalJSON(); 
       callback_handler(data.domain); 
      } 
     } 
    ); 
}; 

...但如果有人(或原型本身)有一個更好的解決方案,我想知道?基於Ajax.getTransport方法的來源

+0

有一個合併的請求,可以幫助CORS請求工作,這裏https://github.com/sstephenson/prototype/pull/88。它不在1.7.1發行版中,但是你可以從github repo構建或者使用這個非官方版本http://cdnadmin.freewaypro.com/libraries/16 –

+0

啊有趣!然而,這個拉取請求似乎正在解決所有瀏覽器中的Prototype和CORS問題,但不是IE8/9問題,它特別涉及那些版本中的'XMLHttpRequest'對象不能處理跨域請求,以及Prototype如何' t似乎佔了這一點。 –

+0

您的權利 - 我會看看是否可以一起獲取處理「XDomainRequest」對象的合併請求。 –

回答

0

var Ajax = { 
    getTransport: function() { 
    return Try.these(
     function() {return new XMLHttpRequest()}, 
     function() {return new ActiveXObject('Msxml2.XMLHTTP')}, 
     function() {return new ActiveXObject('Microsoft.XMLHTTP')} 
    ) || false; 
    } 
} 

你可以看到,getTransport將嘗試返回每個列出的運輸的一個新實例。所以,你可以實現一個預先添加XDomainRequest的polyfill。

var _getTransport = Ajax.getTransport; 
Ajax.getTransport = function() { 
    return Try.these(
     function() { return new XDomainRequest() }, 
     _getTransport 
    ) || false; 
}; 

如果你的地方,包括原型,首先使用的Ajax.Request之間插入此代碼,它應該無縫地在可能情況下使用XDR。

N.B.這完全沒有經過測試,幾乎肯定有一些邊緣情況 - 我不確定XDR的行爲是否適用於同域請求。

相關問題