Jquery $.ajax 在 IE 中跨域调用失败
我正在使用 $.ajax
进行跨域请求。它适用于 Firefox 和 Chrome,但不会在 IE 7 或 8 上发出调用。任何人都可以告诉我以下内容有什么问题吗?
- 我使用过 JSON 和 JSONP(由于一些自定义限制,我停止使用它们)。
- 我已经在我的网站上使用
Allow-access-control-origin
标头。 (没有这些,Chrome 和 Firefox 就无法成功发出请求。) - 我已经尝试过 https://developer.mozilla .org/en/http_access_control
代码:
$.ajax({
type: 'GET',
url: "http://anotherdomain.com/Service/GetControl?id=" + zoneID,
cache: false,
contentType: "application/x-www-form-urlencoded",
async: false,
beforeSend: function (request) {
//alert('before send');
//request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//request.setRequestHeader("X-PINGOTHER", "pingpong");
} ,
success: function (data, status) {
//alert("Data returned :" + data);
//alert("Status :" + status);
if (status == "success" && data != "")
$("#" + div.id).append(data);
else
$("#" + div.id).attr("style", "display:none;");
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
alert(errorThrown);
}
});
我已经尝试了多个网站上提供的各种提示,但还没有成功。
I am doing a cross domain request using $.ajax
. It works on Firefox and Chrome, but does not issue a call on IE 7 or 8. Can anyone tell me what's wrong with the following?
- I have used JSON and JSONP (which I stopped using, due to some custom restrictions).
- I am already using
Allow-access-control-origin
header on my site. (Without those, Chrome and Firefox were not making successful requests.) - I have already tried https://developer.mozilla.org/en/http_access_control
Code:
$.ajax({
type: 'GET',
url: "http://anotherdomain.com/Service/GetControl?id=" + zoneID,
cache: false,
contentType: "application/x-www-form-urlencoded",
async: false,
beforeSend: function (request) {
//alert('before send');
//request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//request.setRequestHeader("X-PINGOTHER", "pingpong");
} ,
success: function (data, status) {
//alert("Data returned :" + data);
//alert("Status :" + status);
if (status == "success" && data != "")
$("#" + div.id).append(data);
else
$("#" + div.id).attr("style", "display:none;");
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
alert(errorThrown);
}
});
I have tried various tips present on multiple sites, but no luck yet.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
对于 IE8 和IE9则需要使用XDomainRequest (XDR)。如果您看下面,您会发现它的格式与 $.ajax 类似。就我的研究而言,我无法让这个跨域在 IE6 和 IE6 中工作。 7(仍在寻找解决方法)。 XDR 首次出现在 IE8 中(IE9 中也有)。所以基本上首先,我测试 6/7 并且不执行 AJAX。
IE10+ 能够像所有其他浏览器一样正常地进行跨域(恭喜微软......叹息)
之后, else if 在窗口中测试“XDomainRequest”(显然比浏览器嗅探更好)并以这种方式执行 JSON AJAX 请求,其他明智的是,ELSE 通常使用 $.ajax 执行此操作。
希望这有帮助!我花了很长时间才弄清楚这一切
有关 XDomainRequest 的信息对象
For IE8 & IE9 you need to use XDomainRequest (XDR). If you look below you'll see it's in a sort of similar formatting as $.ajax. As far as my research has got me I can't get this cross-domain working in IE6 & 7 (still looking for a work-around for this). XDR first came out in IE8 (it's in IE9 also). So basically first, I test for 6/7 and do no AJAX.
IE10+ is able to do cross-domain normally like all the other browsers (congrats Microsoft... sigh)
After that the else if tests for 'XDomainRequest in window (apparently better than browser sniffing) and does the JSON AJAX request that way, other wise the ELSE does it normally with $.ajax.
Hope this helps!! Took me forever to get this all figured out originally
Information on the XDomainRequest object
您能否检查一下 IE 的问题是否依赖于未定义安全区域以允许跨域请求? 请参阅此 Microsoft 页面以获取说明。
OTOH,此页面提到 IE7 eariler 不能进行跨域调用,但 IE8 可以,使用与 XMLHttpRequest(JQuery 使用的对象)不同的对象。您能检查一下 XDomainRequest 是否有效吗?
编辑(2013-08-22)
第二个链接已失效,所以我在这里写下它的一些信息,取自回程机:
Could you check if the problem with IE relies on not defining security zones to allow cross domain requests? See this microsoft page for an explanation.
OTOH, this page mentions that IE7 and eariler cannot do cross domain calls, but IE8 can, using a different object than XMLHttpRequest, the one JQuery uses. Could you check if XDomainRequest works?
EDIT (2013-08-22)
The second link is dead, so I'm writing here some of its information, taken from the wayback machine:
Jquery 为你做到了这一点,唯一的事情就是设置
$.support.cors = true;
然后跨域请求在 jquery 用户的所有浏览器中都可以正常工作。Jquery does this for you, only thing is to set
$.support.cors = true;
Then cross domain request works fine in all browsers for jquery users.只需安装此 jQuery 插件:适用于 IE8 的 jQuery 跨域 AJAX
这个 1.4kb 插件可以立即在 Internet Explorer 8 和 9 中运行。
在 jQuery 之后包含该插件,并正常调用您的 ajax 请求。没有其他需要。
Simply install this jQuery Plugin: jQuery Cross-Domain AJAX for IE8
This 1.4kb plugin works right away in Internet Explorer 8 and 9.
Include the plugin after jQuery, and call your ajax request as normal. Nothing else required.
向 IE 的 jquery 添加额外的传输。
(只需在脚本末尾添加此代码)
这解决了我的 Jquery $.ajax 跨域 AJAX 请求失败的问题。
干杯。
Add extra transport to jquery for IE.
( Just add this code in your script at the end )
This solved my problem with Jquery $.ajax failing for Cross Domain AJAX request.
Cheers.
其他来到这里的人可能最好阅读 http ://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx 讨论了 XDomainRequest 的限制
Others coming around here might do well to read http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx which talks about limitations of XDomainRequest
对于使用 jQuery 2.0 可能仍然遇到此问题的人(我知道我确实如此),Jay Dave 编写了最好的 jQuery 解决方法,但我仍然需要在他的代码中添加一些内容,即:
完整代码如下:
For anyone whom might still have this problem using jQuery 2.0 (I know I do), Jay Dave wrote the best jQuery workaround but I still have a few things to add to his code namely:
The complete code is below:
注意,添加
足以强制 $.ajax 调用在 IE8 上工作
Note, adding
was sufficient to force $.ajax calls to work on IE8
只需添加“?回调=?” (或“&callback=?”)到您的网址:
进行调用时(如上所示,为跨域正确设置其他所有内容),这将触发正确的 JSONP 格式。
更深入的解释可以在此处的答案中找到。
Simply add "?callback=?" (or "&callback=?") to your url:
When doing the calls (with everything else set properly for cross-domain, as above) this will trigger the proper JSONP formatting.
More in-depth explanation can be found in the answer here.
@Furqan能否请您告诉我您是否使用 HTTP POST 方法对此进行了测试,
因为我也在处理相同的情况,但我无法将数据 POST 到不同的域。
但阅读这个 这很简单......唯一的事情是你必须忘记旧的浏览器。我提供了使用上述 URL 中的 POST 方法发送的代码,以供快速参考
@Furqan Could you please let me know whether you tested this with HTTP POST method,
Since I am also working on the same kind of situation, but I am not able to POST the data to different domain.
But after reading this it was quite simple...only thing is you have to forget about OLD browsers. I am giving code to send with POST method from same above URL for quick reference
微软总是弄巧成拙(至少在 IE 中):
http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
CORS 与 IE8 中的 XDomainRequest 配合使用。但 IE 8 不支持预检或凭证请求,而 Firefox 3.5+、Safari 4+ 和 Chrome 都支持此类请求。
Microsoft always ploughs a self-defeating (at least in IE) furrow:
http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
CORS works with XDomainRequest in IE8. But IE 8 does not support Preflighted or Credentialed Requests while Firefox 3.5+, Safari 4+, and Chrome all support such requests.
我在 IE 中有同样的问题,我通过替换解决了它:
所以
基本上升级你的 jquery 版本。
I have the same problem in IE, I solved it by replacing:
To
So basically upgrade your jquery version.
我在 IE9 中遇到了类似的问题,其中一些 CORS 调用正在中止,而另一些则没有。我的应用程序还依赖于 Promise 接口,因此上面的 XDomainRequest 建议并不完全是我所需要的,因此我在 service.get 中添加了一个适用于 IE9 的 deferred 解决方法。希望它对其遇到此问题的其他人有用。 :
I had a similar problem in IE9 where some CORS calls were aborting, while others weren't. My app is also dependent on a promise interface, so the XDomainRequest suggestions above weren't EXACTLY what I needed, so I added a deferred into my service.get workaround for IE9. Hopefully it can be useful to someone else running across this problem. :
由于问题中缺乏格式,很难说,但我认为 ajax 调用存在两个问题。
1) contentType 的 application/x-www-form-urlencoded 应该用引号引起来
2) 应该用逗号分隔 contentType 和异步参数。
It's hard to tell due to the lack of formatting in the question, but I think I see two issues with the ajax call.
1) the application/x-www-form-urlencoded for contentType should be in quotes
2) There should be a comma separating the contentType and async parameters.