2

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

  1. IE9 和 jQuery 1.8.1
  2. 呼叫是asyncjsonp并且crossdomaincachefalse。这些是我找到的先决条件。
  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 的评论,一些进一步的研究 ---

  1. XDomainRequest确实,在jQuery源代码(1.8.1)中找不到
  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 transport jQuery.ajaxTransport( "script", function(s) {

    // This transport only deals with cross domain requests
    if ( s.crossDomain ) {
    
  5. 2010 年的类似情况:Jquery $.ajax 在 IE 中的跨域调用失败然而,这应该已经被后来的 jQuery 版本解决了。

4

3 回答 3

5

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

  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: true, jsonpand crossdomain: true, cacheis false, jQuery.support.corsistrue这些是我找到的先决条件。
  3. 还要确保jsonp响应是函数调用(JSON 包裹在函数中),而不是“普通的”JSON 数据。
于 2012-10-13T21:21:25.567 回答
3

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

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

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

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

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

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

  2. 通过它的 variableName 使用数据

希望这可以帮助 :)

于 2014-08-15T15:30:31.107 回答
2

IE 要求您使用XDomainRequestXHR 而不是跨站点。

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

或者看到这个:

拒绝访问 IE 上的 jQuery 脚本

于 2012-10-12T18:35:49.740 回答