2013-10-23 75 views
5

我们遇到了一个$ .getJSON调用的奇怪问题,它似乎只影响旧版本的IE。代码如下:

var success = function (response) { 
    // do stuff 
} 

$.getJSON(url, success); 

在Chrome浏览器,火狐,IE10,此代码的工作就好了 - 的getJSON命中URL(这是有效的,不是跨域),返回200 OK并返回数据,如你所期望的那样,它被传递给成功功能。

但是,在IE9及以下版本中,会调用成功回调,但传递的响应参数未定义。通过在IE开发工具中捕获网络流量,我可以看到呼叫击中URL,返回200 OK并返回响应正文中的有效JSON。那么为什么当它成功回调时出现未定义?

我试过使用$ .ajax调用,而不是使用适当的参数,我看到了相同的行为。下面的代码:

$.ajax({ 
    dataType: "json", 
    url: url, 
    success: success 
}; 

我们使用jQuery 1.7.2(我们已经在页面上得到了图书馆之一是jQuery的新版本,因此旧版本断下)。

编辑:刚刚尝试更新页面使用jQuery 1.10.1,不解决问题。

编辑2:我已经确认返回的JSON数据通过jsonlint.com有效,所以这也不是问题。

+0

如果使用简单的'XMLHttpRequest',是否会发生同样的问题? –

+0

@ Qantas94Heavy在调用$ .ajax?我刚才编辑的问题包括 - 是的,我试过使用$ .ajax,相同的行为 –

+0

什么是数据被返回? –

回答

1

原来,这不是一个jQuery问题 - 它与服务器返回的内容类型标题有关。无论出于何种原因(仍然不清楚导致问题的原因是什么),服务器返回的媒体类型(尽管是普通的旧应用程序/ json)在旧版IE浏览器下没有被jQuery正确解释。我对服务器端代码进行了更改以返回特定于供应商的JSON内容类型,现在代码再次运行。

编辑:它发生在我身上,其中一个变化服务器端是从版本0.17升级到版本0。我们使用Nancy框架中的20个来为请求提供服务。我猜这可能会以某种微妙的方式影响头文件,尽管我还没有完全追踪到底如何。

+0

我遇到同样的问题。这非常烦人。你能更具体地了解一下供应商特定的JSON内容类型吗? – user2483724

+1

@ user2483724供应商特定的内容类型如下所示:application/vnd.mycompany.mytype + json;版本= 1。 您可以使用它们更明确地指定在您的域的上下文中传输的数据类型以及版本资源。有更多的细节[这里](http://stackoverflow.com/questions/13035169/versioning-rest-apis-and-vendor-specific-content-type),并在网上加载更多 –

1

如果缓存结果,那么缓存设置为false请求之前:

$.ajaxSetup({ cache: false }); 

如果缓存结果,那么使用的getJSON阿贾克斯代替:

$.ajax({ 
    url: 'data.json', 
    cache: false, 
    dataType: 'json', 
    success: function(data) { 
     console.log('success', data); 
    }, 
    error: function (request, status, error) { 
     console.log('error', error); 
    } 
}); 

如果MIME类型是错误的,然后指定dataType:

$.getJSON('data.json', 'json', function(data) { 
    console.log('getJSON', data); 
}); 

如果MIME类型错误,则指定的dataType在服务器上:

header('Content-type: application/json'); 

如果它是那么的变量冲突重命名你的回调变量:

var success = function (newname) { 
    console.log('success', newname); 
} 
$.getJSON(url, success); 

如果它是跨起源请求,那么你可以强制的jQuery与使用它:

$.support.cors = true; 
+0

尝试了所有这些,没有任何区别。然而,我注意到脚本中使用getJSON到另一个服务的另一个调用工作正常,而另一个调用相同问题服务的页面现在也不在IE9下工作,这导致我怀疑它实际上是服务器端的东西。我会报告回来,如果我找到它... –

+0

看到下面的答案,事实证明这是与服务器返回的内容类型有关(尽管我仍然不是100%的改变或为什么IE浏览器正在barfing在他们)。 –

0

有点晚了比赛,但我会分享我的人绊倒在这个线程解决方案:

我有同样的问题,但原因竟然是有点不同。我将标签传递给包含特殊字符的getJSON url。现在,Chrome为我静静地转换这些字符,但IE没有,导致服务器返回空数据。