2013-03-09 93 views
7

我想使用jQueryp與jQuery,但我得到不一致的行爲。有時腳本有效,有時候不行;我不明白爲什麼。jsonp不一致的錯誤:對象不是函數

這是一個可以通過瀏覽器顯示錯誤:

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 

在下面的例子中,我只是想檢查應用程序是否在線。但這種不一致的行爲可能會發生在其他類似的Ajax調用:

 $.ajaxSetup({ 
     error: function (req, status, ex) {}, 
     success: function (data, status, req) {}, 
     timeout: 2000, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType:"jsonp", 
     url: "http://myUrl.com/ping.php?preventCache="+new Date() 
    }); 
    return $.ajax(); 

服務器端的PHP文件是很簡單太:

<?php 
header("Content-Type: application/javascript; charset=UTF-8"); 
echo $_GET['callback']; 
?> ({ "status": "online" }) 

回答

5

你的問題不是很清楚,我試圖使用相同的回調函數名稱兩次時得到相同的錯誤。在任何情況下,這是怎樣的JSONP應該jQuery中被稱爲:

 var mycallback = 'c'+Math.floor((Math.random()*100000000)+1); 
     $.ajax({ 
        type: 'GET', 
        url: URL, 
        async: true, 
        jsonpCallback: mycallback, 
        contentType: "application/json", 
        dataType: 'jsonp' 

     }).done(function(json){ 
      console.log(json); 
        callback(json); 
     }).fail(function(f){ 
      console.log("f"); 
        console.log(f.status); 
     }).always(function(){ 
        // console.log('complete'); 
     }); 
2

檢查,如果你的腳本製作一個相同的AJAX請求不止一次演替。

我有一個錯誤的事件處理程序,在同一時間發射兩個請求,這導致了同樣的問題。 (看起來你打算爲你的ping調用應用緩存攔截器,但是在$ .ajaxSetup中這樣做可能會產生相反的效果,因爲URL將被修復爲所有後續請求。

15

你會得到這樣的行爲,當您JSONP調用超時(這是兩秒,根據您timeout: 2000線),但在數據到達超時已經發生。

JSONP不使用正常的XmlHTTPRequest。爲了做JSONP,jQuery在你的文檔中插入一個腳本標籤,並且創建一個臨時函數來處理腳本標籤加載(函數名稱是錯誤消息中的長隨機字符串)。

當你的超時發生,腳本還沒有完成加載,jQuery丟棄臨時函數。在此之後的某個時候,腳本標記完成加載,並嘗試調用該函數 - 但時間太晚,該函數已被刪除。因此錯誤。

可能通過擴展超時來減少錯誤,但基本問題是無法取消加載腳本標記。如果它沒有出錯,總是有可能會比你的超時時間長一些。據我所知,對此沒有完整的解決方案。您可以告訴jQuery使用明確命名的函數作爲JSONP回調函數,而不是自己創建,但是您需要跟蹤自己是否超時。你可以使用CORS,這是另一回事。

也許你最好的選擇就是和它一起生活。

相關問題