2013-05-15 63 views
1

好吧,簡單JSONP設置與jQuery,與要求建立了我超越了搜索術語「靜態」的網址:jQuery的「parseerror」靜態JSONP回調函數

function handleJSONPResponse (data, status, request) { 
    // update UI 
} 

$(function() { 
$('#some-input').on('keyup', function() { 
    $.ajax('http://www.example.com/service/', { 
     dataType : 'jsonp', 
     jsonpCallback : 'handleJSONPResponse', 
     data : { 
      search : $('#some-input').val() 
     }, 
     complete : function (xhr, status) { 
      if (status === 'parsererror') { 
       console.log(xhr.responseText) 
      } 
     } 
    }); 
}); 

當用戶按下按鍵,它們請求被解僱。就這個問題而言,如果「hamme」在我們只是想要撥打電話(我在真實的代碼中處理過這個問題)之後返回,那並不重要。我的問題是這樣的......有時,特別是在頻繁的按鍵,我沒有得到一個UI更新,我得到的是被記錄到我的控制檯的錯誤看起來是這樣的:

handleJSONPResponse({"JSON" : "Some Data"}) 

所以,你可以看到,jQuery的響應文本沒問題,但它仍然導致了一個parseError。我還驗證了JSON內容是確定的。 讓我強調一下,有時候「錘子」的JSONP起作用,有時候「錘子」的JSONP失敗。它不是後端錯誤;我總是在我的xhr.responseText中獲得看起來像有效的JSONP響應。

我試過這與JSONP回調處理程序傳遞到Ajax請求的「成功」參數,但這不會更改操作。我唯一能做的就是防止出現這個錯誤,就是刪除指定的JSONP回調名稱並讓jQuery隨機創建一個名稱,但是我的緩存層有一個要求,即我必須保持URL靜態,因此需要一個靜態回調名稱。

我該怎麼做,以確保我不會隨機獲取parseError從jQuery失敗?

這裏你可以看到一個例子:

http://jsfiddle.net/yVqpS/

的的jsfiddle「回聲」 JSONP產生錯誤遠遠頻率低於我的本地服務,但是如果你在錘它,你會看到一些「handleJSONPResponse未定義「錯誤通過您的控制檯...

說明: 跨域是必需的,所以任何不是跨域不起作用。對不起,除了使用JSONP作爲我的標準而不是普通的Ajax請求之外,我沒有在第一個示例中做出更清晰的說明。

回答

1

它可能更容易,只需使用$ .getScript在這種情況下:

http://jsfiddle.net/yVqpS/1/(注意它是如何運行腳本的身體,而不是DOM頭部載荷也可以工作功能必須在全局命名空間中定義。 )

function handleJSONPResponse(data, status, request) { 
    console.log('response', data); 
} 

$(function(){ 
    $('#some-input').on('keyup', function() { 
     $.getScript('http://jsfiddle.net/echo/jsonp/?' + $.param({ 
      search: $('#some-input').val() 
     }) + "&callback=handleJSONPResponse"); 
    }); 
}); 
+0

不幸的是,這不是一個選項。 $ .getScripts()只是$ .ajax()的包裝,它不是跨域的。如果您使用crossDomain:true參數來強制它,那麼它只是轉換爲以任意方式創建一個隨機命名的JSONP請求。 –

+1

@JonHartmann'$ .getScript'因爲同樣的原因可以很好的跨域運行''的作品。 –

+0

如果您使用'dataType:「jsonp」',那麼您不能使用您想要的靜態函數,因爲jQuery將爲您創建一個靜態函數。 –