2

jQuery ajax を実行しようとしていますが、Firfox と Chrome では動作しますが、Internet Explorer 9 では動作しません。

最終的なコードはサブドメインをまたぐ必要がありますが、これはデフォルトのトランスポートでは機能しません。

だから私は Internet Explorer で使用するカスタム トランスポートを作成しようとしています。

方法 1

$.ajaxTransport("+*", function (options, originalOptions, jqXHR) {
    if (jQuery.browser.msie && window.XDomainRequest) {
        var xdr;
        return {
            send: function (headers, completeCallback) {
                // Use Microsoft XDR
                xdr = new XDomainRequest();
                xdr.open("get", options.url);
                xdr.onload = function () {
                    if (this.contentType.match(/\/xml/)) {
                        var dom = new ActiveXObject("Microsoft.XMLDOM");
                        dom.async = false;
                        dom.loadXML(this.responseText);
                        completeCallback(200, "success", [dom]);
                    } else {
                        completeCallback(200, "success", [this.responseText]);
                    }
                };
                xdr.ontimeout = function () {
                    completeCallback(408, "error", ["The request timed out."]);
                };
                xdr.onerror = function () {
                    completeCallback(404, "error", ["The requested resource could not be found."]);
                };
                xdr.send();
            },
            abort: function () {
                if (xdr) xdr.abort();
            }
        };
    }
});

ここで最初の手法を示す簡単なサンプル ページを作成しました: http://services.whygo.net/sendAjax.htm

カスタム トランスポートを使用する場合、更新しない限り、通常のトランスポートは失敗することに注意してください。

アイデアはここから来ています: http://forum.jquery.com/topic/cross-domain-ajax-and-ie#14737000002203097

これにより、$ajax で呼び出された 'error' メソッドが失敗したときに、'error' メソッド内で 'error' 以外のエラー メッセージが表示されません。if dev ツールの [Network] タブで 405 Method not allowed が表示されますが、サーバー側のものは実行されます。

方法 2 ここで説明する別の方法も試しました: クロスサブドメイン AJAX は IE ではなく Chrome で動作します

if ('XDomainRequest' in window && window.XDomainRequest !== null) {

    // override default jQuery transport
    jQuery.ajaxSettings.xhr = function() {
        try { return new XDomainRequest(); }
        catch(e) { }
     };
}

これはここにあります: http://www.whygo.net/sendAjax2.html

これについては、開発ツールの「ネットワーク」タブで実際に 200 個のコードを取得しますが、$ajax の「エラー」または「成功」パラメータを呼び出しません。

この 2 番目にタイムアウトを設定すると、「エラー」関数に「タイムアウト」のメッセージが返されます。

4

2 に答える 2

3

この矛盾に約1日苦労した後、私が行った解決策は次のとおりです...

// new method as to not overwrite jQuery's defaults
var cors = (window.XDomainRequest) ? function(url, callback) {

    var xdr = new XDomainRequest();
    xdr.open('get', url);
    xdr.onload = function() { callback(xdr.responseText); }
    xdr.send();

} : $.get; // else, use jQuery's method

使用する...

cors(url, function(msg) { alert(msg); }); // pretty well same as $.get

もちろん、これはすべての目的に役立つわけではありませんが、開始点であり、機能します。

于 2012-08-17T23:01:36.547 に答える
1

http://services.whygo.net/sendAjax2.htmlページでは、AJAX 応答がサーバーから JSON として返されることが期待されていることがわかりますdataTypeが、実際には応答はプレーン テキスト文字列 ( 「メールは正常に送信されました。」)

おそらく、コメントアウトしてdataType、jQuery にどのタイプの応答が返されるかを判断させることができます。

于 2012-07-26T16:23:16.700 に答える