【发布时间】: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 服务?