簡體   English   中英

$ .getJSON在IE9及以下版本中將undefined返回到成功回調

[英]$.getJSON returning undefined to success callback in IE9 and below

我們遇到了一個奇怪的問題,$ .getJSON調用似乎只影響舊版本的IE。 代碼如下:

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

$.getJSON(url, success);

在Chrome,Firefox,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有效的,所以這也不是問題。

如果它正在緩存結果,則在請求之前將緩存設置為false:

$.ajaxSetup({ cache: false });

如果它正在緩存結果,那么使用ajax而不是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;

事實證明這不是一個jQuery問題 - 它與服務器返回的內容類型標題有關。 無論出於何種原因(仍然不清楚究竟是什么原因導致問題)服務器返回的媒體類型(盡管是普通的舊應用程序/ json)在舊版本的IE下沒有被jQuery正確解釋。 我對服務器端代碼進行了更改,以返回特定於供應商的JSON內容類型,現在代碼再次運行。

編輯:我發現其中一個更改服務器端是從我們用來提供請求的Nancy框架的版本0.17升級到版本0.20。 我猜這可能會以某種微妙的方式影響標題,但我仍然沒有找到確切的方法。

游戲有點晚,但我會為任何絆倒這個線程的人分享我的解決方案:

我有同樣的問題,但原因結果有點不同。 我將標簽傳遞給包含特殊字符的getJSON網址。 現在Chrome默默地為我轉換這些字符,但IE沒有,這導致服務器返回空數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM