jQuery跨域请求仍然在IE中失败,但使用jsonp

Hor*_*ter 2 javascript jquery cross-domain internet-explorer-9

我的Ajax跨域请求在IE 9中失败,并且"拒绝访问".我已经阅读了几篇关于这个主题的帖子,AFAIK应该可以使用.

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

那么为什么这会因拒绝访问而失败?任何的想法?可能是因为我的代码是从"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
        }
    });
Run Code Online (Sandbox Code Playgroud)

- 编辑 - 根据Robotsushi的评论,进一步研究---

  1. 的确,XDomainRequest在jQuery源代码中找不到(1.8.1)
  2. 如果我没有设置cors(jQuery.support.cors = true),我最终会遇到"No Transport"异常.
  3. 仍然想知道为什么其他人明显成功使用IE9跨域请求,例如:jQuery跨域Ajax JSONP调用随机因某些IE版本中的未知原因而失败
  4. jQuery处理这个问题的方式,似乎是围绕下面的代码,但在我的特定情况下没有调用,不知道为什么?

    //绑定脚本标记hack transport jQuery.ajaxTransport("script",function(s){

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

Hor*_*ter 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,jsonpcrossdomain: true,cachefalse,jQuery.support.corstrue这是我发现的先决条件.
  3. 还要确保jsonp响应是一个函数调用(函数中包含JSON),而不是 "普通的"JSON数据.