【问题标题】:Jquery Ajax, not working in Internet explorerJquery Ajax,不在 Internet Explorer 中工作
【发布时间】:2012-07-26 15:28:28
【问题描述】:

我正在尝试做一些 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,但服务器端的东西确实执行了。

方法二 我还尝试了这里描述的另一种方法: 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 的“错误”或“成功”参数。

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

【问题讨论】:

  • 您是否收到任何类型的错误消息?
  • @ExplosionPills 不,我没有收到任何有用的错误消息。
  • 您是否尝试通过 jquery 调用跨域 WCF REST 服务?

标签: asp.net ajax wcf jquery


【解决方案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

复制和粘贴,这当然不能满足所有目的,但它是一个开始并且有效。

【讨论】:

    【解决方案2】:

    http://services.whygo.net/sendAjax2.html 页面上,我看到您从服务器以 JSON 形式返回的 AJAX 响应的预期 dataType,但响应实际上以纯文本字符串的形式返回(“电子邮件已成功发送。”)。

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

    【讨论】:

    • 嗨蒂姆,感谢您的建议,我试过了,但没有帮助,它仍然没有返回“成功”或“错误”功能
    猜你喜欢
    • 2012-02-23
    • 2012-01-04
    • 2012-07-31
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多