以下内容适用于除IE以外的所有浏览器(我正在IE 9中进行测试)。
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert('marked as read');
},
error: function(a,b,c) {
alert('failed');
},
type: 'post'
}
);
我有另一个使用 dataType: 'jsonp'
的函数,但我不需要在此 AJAX 调用中返回任何数据。我最后的手段是返回一些包裹在 JSONP 中的乱码,只是为了让它工作。
知道为什么IE搞砸了一个不返回数据的CORS请求吗?
这是jQuery的一个已知错误。jQuery团队"没有计划在核心中支持它,更适合作为插件。(请参阅此评论)。IE 不使用XMLHttpRequest,而是使用名为 XDomainRequest 的替代对象。
在jQuery中有一个插件可以支持这一点,可以在这里找到:https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
编辑该函数$.ajaxTransport
注册运输机工厂。$.ajax
在内部使用传输器来执行请求。因此,我认为您应该能够像往常一样打电话给$.ajax
。有关运输商和扩展$.ajax
的信息可以在这里找到。
此外,可以在此处找到此插件的更好版本。
另外两个注意事项:
- 对象 XDomainRequest 是从 IE8 引入的,在下面的版本中不起作用。
- 从IE10开始,将使用普通的XMLHttpRequest支持CORS程序。
编辑 2:http 到 https 问题
请求必须针对与托管页面相同的方案
此限制意味着,如果您的 AJAX 页面位于 http://example.com,则您的目标网址也必须以 HTTP 开头。 同样,如果您的 AJAX 页面处于 https://example.com,那么您的 目标网址也必须以 HTTPS 开头。
来源: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
在@dennisg接受的答案的基础上,我使用 MoonScript 的 jQuery.XDomainRequest.js 成功完成了此操作。
以下代码在Chrome,Firefox和IE10中正常工作,但在IE9中失败。我只是简单地包含了脚本,它现在可以在IE9中自动工作。(可能是 8 个,但我还没有测试过。
var displayTweets = function () {
$.ajax({
cache: false,
type: 'GET',
crossDomain: true,
url: Site.config().apiRoot + '/Api/GetTwitterFeed',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (data) {
for (var tweet in data) {
displayTweet(data[tweet]);
}
}
});
};
有关如何使用"jQuery-ajaxTransport-XDomainRequest"插件执行此操作的完整说明可以在这里找到:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
该插件受到积极支持,并处理HTML,JSON和XML。 该文件也托管在 CDNJS 上,因此您可以直接将脚本拖放到您的页面中,而无需进行其他设置:http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js
问题是IE9及更低版本不支持CORS。XDomainRequest 仅支持 GET/POST 和 text/plain
conten-type,如下所述:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
因此,如果您想使用所有HTTP动词和/或json等,则必须使用另一种解决方案。我写了一个代理,如果使用IE9或更低版本,它将优雅地降级为代理。如果您使用的是 ASP.NET,则根本不需要更改代码。
解决方案分为两部分。第一个是jquery脚本,它挂接到jQuery ajax处理中。如果发出跨域请求并且浏览器是 IE,它将自动调用 Web 服务器:
$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
if (!window.CorsProxyUrl) {
window.CorsProxyUrl = '/corsproxy/';
}
// only proxy those requests
// that are marked as crossDomain requests.
if (!options.crossDomain) {
return;
}
if (getIeVersion() && getIeVersion() < 10) {
var url = options.url;
options.beforeSend = function (request) {
request.setRequestHeader("X-CorsProxy-Url", url);
};
options.url = window.CorsProxyUrl;
options.crossDomain = false;
}
});
在你的Web服务器中,你必须接收请求,从X-CorsProxy-Url http标头中获取值,然后执行HTTP请求,最后返回结果。
我的博客文章:http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
我只是提出了所有请求JSONP,因为它是我们所有支持的浏览器(IE7 +和常规浏览器)的唯一解决方案。请注意,您的答案在技术上适用于IE9,因此您有正确的答案。
在MoonScript的解决方案的基础上,你可以试试这个:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
好处是,由于它是一个较低级别的解决方案,它将在IE 8/9上与其他框架一起启用CORS(尽可能),而不仅仅是jQuery。我已经成功地将它与AngularJS以及jQuery 1.x和2.x一起使用。
在 Internet Explorer 8 及更高版本中使用 jQuery 获取跨域 JSON
非常有用的链接:
http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/
可以帮助解决从 X 域请求返回 json 的麻烦。
希望这对某人有所帮助。
要解决此问题,还要检查您的 ajax 文件中是否包含了一些.js,称为:在我的 ajax.php
我正在开发计算机上测试 CORS Web 服务,并且仅在 IE 中收到"访问被拒绝"错误消息。 Firefox和Chrome工作正常。 事实证明,这是由于我在 ajax 调用中使用了本地主机引起的! 所以我的浏览器 URL 是这样的:
http://my_computer.my_domain.local/CORS_Service/test.html
我在测试中的 Ajax 调用.html是这样的:
//fails in IE
$.ajax({
url: "http://localhost/CORS_Service/api/Controller",
...
});
一旦我将 ajax 调用更改为使用我的计算机 IP 而不是本地主机,一切正常。
//Works in IE
$.ajax({
url: "http://192.168.0.1/CORS_Service/api/Controller",
...
});
IE 开发工具窗口"网络"选项卡还显示 CORS 预检选项请求,后跟 XMLHttpRequest GET,这正是我期望看到的。
> 更新截至 2015 年初。 xDomain 是一个广泛使用的库,用于在 IE9 上支持 CORS,但额外编码有限。
https://github.com/jpillora/xdomain
尝试在IE8/9中对CORS请求使用jquery-transport-xdr jQuery插件。
注意 -- 注意
不要在 ajax 中使用"http://www.domain.xxx"或"http://localhost/"或"IP>> 127.0.0.1"作为 URL。仅使用路径(目录)和页面名称而不带地址。
错误状态:
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
真实状态:
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true); // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);