2

我正在尝试做一些 jQuery ajax,它适用于 Firfox 和 Chrome,但不适用于 Internet Explorer 9。

最终代码必须跨越子域,这在默认传输中不起作用。

所以我正在尝试创建一个自定义传输以在 Internet Explorer 中使用

方法一

$.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' 之外没有任何错误消息,当它失败时。我确实在 if 开发工具的“网络”选项卡上得到了一个 405 Method not allowed,但服务器端的东西确实执行了。

方法 2 我也尝试过这里描述的另一种方法: Cross-subdomain AJAX works in Chrome, not IE

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

在这一点上,我实际上在 ie 开发工具的“网络”选项卡上获得了 200 个代码,但没有调用 $ajax 的“错误”或“成功”参数。

如果我在第二个超时,那么它会返回到“错误”函数并显示“超时”消息。

4

2 回答 2

3

这是我在与这种不一致问题苦苦挣扎一天后所采用的解决方案......

// 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页面上,我看到您期望dataTypeAJAX 响应以 JSON 形式从服务器返回,但响应实际上以纯文本字符串( “电子邮件已成功发送。”)。

也许您可以尝试注释掉dataType并让 jQuery 找出返回的响应类型。

于 2012-07-26T16:23:16.700 回答