【问题标题】:jQuery cross domain request still failing in IE, but using jsonpjQuery跨域请求在IE中仍然失败,但使用jsonp
【发布时间】:2012-10-03 14:56:18
【问题描述】:

我的 Ajax 跨域请求在 IE 9 中失败并显示“访问被拒绝”。我已经阅读了有关此主题的几篇文章,并且 AFAIK 它应该可以工作。

  1. IE9 和 jQuery 1.8.1
  2. 呼叫是asyncjsonpcrossdomaincachefalse。这些是我找到的先决条件。
  3. 适用于最新的 Firefox 和 Chrome。
  4. jQuery.support.cors 是真的
  5. 甚至设置了响应头:Access-Control-Allow-Origin:* (SO)
  6. 返回的 JSON 代码也是正确的,使用了检查器(另见 3。)

那么,为什么 Access denied 会失败呢?任何想法?可能是因为我的代码是从“JavaScript”库中调用的,而不是页面上的 <script></script> 标记?

我错过了什么?

    // 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的cmets,一些进一步的研究---

  1. 确实在jQuery源码(1.8.1)中找不到XDomainRequest
  2. 如果我不设置 cors (jQuery.support.cors = true),我最终会出现“无传输”异常。
  3. 仍然想知道为什么其他人显然通过 IE9 跨域请求成功,例如在这里:jQuery Cross-Domain Ajax JSONP Calls Failing Randomly For Unknown Reasons In Some IE Versions
  4. jQuery 处理这个问题的方式,似乎在下面的代码中,但在我的特殊情况下没有调用它,不知道为什么?

    // 绑定脚本标签 hack 传输 jQuery.ajaxTransport( "脚本", 函数 {

    // This transport only deals with cross domain requests
    if ( s.crossDomain ) {
    
  5. 2010 年的情况类似:Jquery $.ajax fails in IE on cross domain calls 不过,这个问题应该已经被后来的 jQuery 版本解决了。

【问题讨论】:

    标签: javascript jquery internet-explorer-9 cross-domain


    【解决方案1】:

    好的,现在开始工作。我这边有几个错误:

    1. 它是 crossDomain: true, dataType: "jsonp",错字 - 大写字母丢失。
    2. JSONP 请求透明。数据不是简单的 JSON 表示法,而是必须包装在 Js 函数调用中(在服务器端):参见http://en.wikipedia.org/wiki/JSONP 基本上这意味着,如果您无法修改发送的数据,JSONP 不是您的正确选择。

    考虑所有因素,它有效。所以我的个人清单是:

    1. 如果可能,请使用json(例如,使用 Chrome、FF 或最有可能的 IE10)。确保设置了响应头:Access-Control-Allow-Origin:*
    2. 如果使用jsonp,请检查:async: truejsonpcrossdomain: truecachefalsejQuery.support.corstrue 这些是我找到的先决条件。
    3. 还要确保 jsonp 响应是函数调用 (JSON wrapped in function),不是“只是普通的”JSON 数据。

    【讨论】:

    • 使用 Jquery 1.10 我不需要 cors = true 设置来工作......显然现在更好了。值得庆幸的是,我花了 4 个小时才找到这篇文章(实际上已经修复了)。
    • 您也不需要crossDomain:、访问控制标头、async:cache:jQuery.support.cors
    【解决方案2】:

    我在尝试访问存储在 Google Cloud Storage 上的一些 json 并使用 jQuery 的 ajaxing 访问时遇到了类似的问题。这在 Chrome 和 Firefox 中运行良好,但在 IE(9 及更低版本)中测试时收到“拒绝访问”消息。

    我解决它的方法是明确地使用 jsonP:

    1. 将我的 json 文件重写为带有 javascript 变量的 javascript 文件来保存 json 数据,例如

    (function (o) { variableName = [json]; }(window.[nameSpace] = window.[nameSpace]|| {}));

    1. 在 html 文件的标签中包含 javascript 文件的 url,例如

      <script type="application/javascript" src="[url to javascript file]"></script>

    2. 通过变量名使用数据

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:

      IE 要求您使用 XDomainRequest 而不是 XHR 进行跨站点。

      您可以查看 easyXDM,它是一个为您抽象此过程的 js 库。

      或者看到这个:

      Access denied to jQuery script on IE

      【讨论】:

      • 这不也是jQuery应该做的吗?抽象它并使用 XDomainRequest。
      • 很好的提示,但仍然想知道其他人如何在 IE9 中成功处理他们的 x-doamin 请求:stackoverflow.com/questions/9170718/…
      猜你喜欢
      • 2012-07-29
      • 2013-11-25
      • 2013-07-24
      • 2017-01-11
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多