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

时间:2012-10-12 18:30:44

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

我的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.)
  7. 那么为什么拒绝访问会导致失败?任何的想法?可能是因为我的代码是从“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. 确实,在jQuery源代码(1.8.1)
    2. 中找不到XDomainRequest
    3. 如果我没有设置cors(jQuery.support.cors = true),我最终会遇到“No Transport”例外。
    4. 仍然想知道为什么其他人明显成功使用IE9跨域请求,例如这里:jQuery Cross-Domain Ajax JSONP Calls Failing Randomly For Unknown Reasons In Some IE Versions
    5. jQuery处理这个问题的方式,似乎是围绕下面的代码,但在我的特定情况下没有调用,不知道为什么?

      //绑定脚本标记黑客传输 jQuery.ajaxTransport(“script”,function(s){

      // This transport only deals with cross domain requests
      if ( s.crossDomain ) {
      
    6. 2010年的类似情况:Jquery $.ajax fails in IE on cross domain calls但是,这应该是后来的jQuery版本解决的。

3 个答案:

答案 0 :(得分:5)

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

  1. 这是crossDomain: true, dataType: "jsonp",错字 - 错过大写字母。
  2. JSONP请求透明。数据不仅仅是JSON表示法,而是必须包装在Js函数调用中(在服务器端):请参阅http://en.wikipedia.org/wiki/JSONP基本上这意味着,如果您无法修改发送的数据,JSONP不是正确的选项你。
  3. 考虑到所有事情,它都有效。所以我的个人清单是:

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

答案 1 :(得分:3)

我有一个类似的问题,试图访问我存储在Google云端存储上并使用jQuery的ajaxing访问的一些json。这在Chrome和Firefox中运行良好,但在IE(9及以下)测试时,我收到了“拒绝访问”消息。

我解决这个问题的方法是明确地使用jsonP:

  1. 将我的json文件重写为带有javascript变量的javascript文件,以保存json数据,例如:
  2. (function (o) { variableName = [json]; }(window.[nameSpace] = window.[nameSpace]|| {}));

    1. 在html文件的标记内包含javascript文件的URL,例如

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

    2. 通过它的variableName
    3. 消耗数据

      希望这会有所帮助:)

答案 2 :(得分:2)

IE要求您使用XDomainRequest代替XHR进行跨网站。

您可以查看easyXDM,这是一个js库,可以为您提取此过程的摘要。

或者看看:

Access denied to jQuery script on IE