jQuery跨域请求仍然在IE中失败,但使用jsonp
我的Ajax跨域请求在IE 9中失败,并且“拒绝访问”。 我已经阅读了几篇关于这个主题的post,AFAIK应该可以使用。
- IE9和jQuery 1.8.1
- 调用是
async
,jsonp
和crossdomain
,cache
是false
。 这些是我找到的先决条件。 - 适用于最新的Firefox和Chrome。
-
jQuery.support.cors
是真的 - 甚至设置了响应标头:
Access-Control-Allow-Origin:*
( SO ) - 返回的JSON代码也是正确的,使用了一个检查器(另见3.)
那么为什么在拒绝访问时失败呢? 任何的想法? 可能是因为我的代码是从“JavaScript”库中调用的,而不是页面上的标签?
我错过了什么?
// The code is part of an object's method (prototype) // code resides in a library "Mylib.js" $.ajax({ type: 'GET', url: url, cache: false, async: true, crossdomain: true, // typo, crossDomain, see my answer below datatype: "jsonp", // dataType success: function (data, status) { if (status == "success" && !Object.isNullOrUndefined(data)) { ... } }, error: function (xhr, textStatus, errorThrown) { // access denied } });
– 编辑 – 根据Robotsushi的评论,进一步研究—
- 的确,在jQuery源代码中找不到
XDomainRequest
(1.8.1) - 如果我没有设置cors(
jQuery.support.cors = true
),我最终会遇到“No Transport”exception。 - 仍然想知道为什么其他人明显成功使用IE9跨域请求,例如: jQuery跨域Ajax JSONP调用随机因某些IE版本中的未知原因而失败
-
jQuery处理这个的方式似乎是围绕下面的代码,但是在我的特定情况下没有调用,不知道为什么?
//绑定脚本标记hack transport jQuery.ajaxTransport(“script”,function(s){
// This transport only deals with cross domain requests if ( s.crossDomain ) {
-
2010年的类似情况: Jquery $ .ajax在跨域调用的IE中失败但是,这应该由后来的jQuery版本解决。
好的,现在工作。 我身边的几个错误:
- 它是
crossDomain: true, dataType: "jsonp"
,错字 – 错过大写字母。 - JSONP请求不透明。 数据不仅仅是JSON表示法,而是必须包装在Js函数调用中(在服务器端):请参阅http://en.wikipedia.org/wiki/JSONP基本上这意味着,如果您无法修改发送的数据,JSONP不是适合您的选择。
考虑到所有事情,它的确有效。 所以我的个人清单将是:
- 尽可能使用
json
(例如使用Chrome,FF或IE10)。 确保设置了响应标头:Access-Control-Allow-Origin:*
- 如果使用
jsonp
,请检查:async: true
,jsonp
和crossdomain: true
,cache
为false
,jQuery.support.cors
为true
这些是我找到的先决条件。 - 还要确保
jsonp
响应是一个函数调用(函数中包含JSON ), 而不是 “普通的”JSON数据。
我有一个类似的问题试图访问我存储在Google云端存储上并使用jQuery的ajaxing访问的一些json。 这在Chrome和Firefox中运行良好,但在IE(9及以下)测试时,我收到了“拒绝访问”消息。
我解决它的方法是明确地使用jsonP:
- 重写我的json文件是一个带有javascript变量的javascript文件来保存json数据,例如
(function (o) { variableName = [json]; }(window.[nameSpace] = window.[nameSpace]|| {}));
-
在html文件的标记内包含javascript文件的url,例如
- 通过它的variableName消耗数据
希望这可以帮助 :)
IE要求您在跨站点使用XDomainRequest
而不是XHR。
您可以查看easyXDM,这是一个js库,可以为您提取此过程的摘要。
或者看看这个:
在IE上拒绝访问jQuery脚本