跨域调用是指浏览器从一个域名下的网页向另一个域名下的服务器发起请求。由于浏览器的同源策略(Same-Origin Policy)限制,这种跨域请求默认是被禁止的。
IE浏览器(特别是IE8/9)在跨域请求方面有以下特殊行为:
jQuery的$.ajax在IE中跨域失败通常由以下原因导致:
// 为IE8/9添加XDomainRequest支持
if (window.XDomainRequest && !$.support.cors) {
$.ajaxTransport(function(s) {
if (s.crossDomain && s.async) {
if (s.timeout) {
s.xdrTimeout = s.timeout;
delete s.timeout;
}
var xdr;
return {
send: function(_, complete) {
function callback(status, statusText, responses, responseHeaders) {
xdr.onload = xdr.onerror = xdr.ontimeout = null;
complete(status, statusText, responses, responseHeaders);
}
xdr = new XDomainRequest();
xdr.onload = function() {
callback(200, "OK", { text: xdr.responseText }, "");
};
xdr.onerror = function() {
callback(404, "Not Found", {}, "");
};
xdr.ontimeout = function() {
callback(0, "timeout", {}, "");
};
xdr.timeout = s.xdrTimeout || 0;
xdr.open(s.type, s.url);
xdr.send(s.hasContent && s.data || null);
},
abort: function() {
if (xdr) xdr.abort();
}
};
}
});
}
// 然后正常使用$.ajax
$.ajax({
url: 'http://other-domain.com/api',
type: 'GET',
dataType: 'json',
crossDomain: true,
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error(error);
}
});
确保服务器返回以下响应头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
$.ajax({
url: 'http://other-domain.com/api?callback=?',
dataType: 'jsonp',
success: function(data) {
console.log(data);
}
});
没有搜到相关的沙龙