Jquery Ajax,不在Internet Explorer中工作
我正在尝试做一些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’之外,不会给出任何错误消息。 我确实在if工具的’Network’选项卡上得到了一个405方法,但是服务器端的东西确实执行了。
方法2我还尝试了另一种方法: 交叉子域AJAX在Chrome中运行,而不是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工具的’network’选项卡上获得了200个代码,但是没有调用$ ajax的’错误’或’成功’pararm。
如果我在第二个上加一个超时,那么它会返回’error’函数并显示’timeout’消息。
这是我经过大约一天的努力解决这个不一致之后的解决方案……
// 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
复制和粘贴,这当然不能用于所有目的,但它是一个开始,它的工作原理。
在http://services.whygo.net/sendAjax2.html页面上,我看到你从服务器dataType
的AJAX响应的预期dataType
为JSON,但响应实际上以纯文本字符串forms返回(“电子邮件已成功发送。”)。
也许您可以尝试注释掉dataType
,让jQuery找出dataType
的响应类型。