2009-09-10 57 views
6

jQuery的getScript函數似乎不支持錯誤回調函數。我不能在這裏使用全局ajax錯誤處理代碼,本地錯誤函數將是理想的。處理jQuery.getScript中的錯誤

回調獲取data/textStatus的文檔看起來不正確 - 回調既沒有。

關於如何檢測getScript調用失敗(例如服務器不可用)的任何建議?

編輯:只看了看源代碼,似乎回調只是在成功時調用,數據總是設置爲null,textStatus沒有定義(因爲這是一個成功回調,我猜)。該功能的文檔非常不正確。

回答

-1

這是一個黑客攻擊的一位,但..

你可以聲明腳本里面的變量加載並檢查它已加載腳本(假定完整功能仍然火災)後:

script_test.js:

var script_test = true; 

然後:

$.getScript("script_test.js", function() 
{ 
    if (typeof script_test !== undefined) alert("script has been loaded!"); 
}); 

或者你可以試着看看你的腳本中是否存在 - 實際上存在 - 函數,變量,對象等


更通用的方法是在腳本中添加一個自我執行的函數要加載,使他們在你的 「主」 腳本執行功能:

main_script.js:

function scriptLoaded(scriptName) 
{ 
    alert(scriptName + " loaded!"); 
} 

$.getScript("script_test.js"); 

script_test.js:

(function() 
{ 
    scriptLoaded("script_test.js"); 
})(); 
+0

是的,這就是我目前正在做的事情,但正如你所說,這有點破解。順便說一句,代碼應該是if (typeof script_test !== "undefined") ... psychotik 2009-09-10 17:56:13

+0

是的,這是一個黑客。你有沒有考慮我的第二個例子?而且..我不相信你需要typeof操作符。 – roosteronacid 2009-09-10 18:13:50

+0

感謝您的第二個建議。另外,除非我真的瘋了,如果var沒有被定義在任何地方,你將需要typeof。嘗試在腳本中運行下面的這個函數(在之前沒有提及foo)。你會注意到在JS控制檯中的錯誤:function test(){if(foo === undefined)alert(「Yay!」); } – psychotik 2009-09-10 18:21:48

5

全局JQuery Ajax-ErrorHandler將會工作!

在$ .getScript-Call之前設置錯誤處理程序來緩存錯誤。

$(document).ajaxError(function(e, xhr, settings, exception) { 
    alert('error in: ' + settings.url + ' \n'+'error:\n' + exception); 
}); 

正如JQuery手冊中所述:http://api.jquery.com/ajaxError/

26

從jQuery 1.5開始,您可以在調用getScript時附加一個.fail。

$.getScript('foo.js', function(){ 
    //script loaded and parsed 
}).fail(function(){ 
    if(arguments[0].readyState==0){ 
     //script failed to load 
    }else{ 
     //script loaded but failed to parse 
     alert(arguments[2].toString()); 
    } 
}) 

http://api.jquery.com/jQuery.getScript/#handling-errors

+13

如果腳本是一個跨域URL('always'回調函數或全局''ajaxError'處理函數也沒有'fail'回調函數。 – 2012-07-03 20:30:56

+3

'fail'回調函數與跨域URL一起使用在jQuery 2.0+ – tee 2014-05-14 22:20:18

17

對於跨域腳本標記,成功事件觸發,但錯誤事件沒有;不管你使用什麼語法。你可以試試這個方法:

  1. 創建一個錯誤處理程序,並將其設置使用handle = window.setTimeout
  2. 內,您的成功回調函數幾秒鐘後開火,取消使用window.clearTimeout(handle)

示例代碼超時:

var timeoutId; // timeout id is a global variable 
timeoutId = window.setTimeout(function() { 
    alert("Error"); 
}, 5000); 
$.getScript("http://other-domain.com/script.js", function(){ 
    window.clearTimeout(timeoutId); 
}); 
+0

起初,這似乎是一個相當醜陋的解決方案,但它是唯一一個實際與adblockers一起工作的。所以非常感謝! – devsnd 2014-08-13 15:21:03

+0

我很想知道這個問題是否在新版本的jQuery中得到解決。我注意到這一點,我正在使用jQuery 1.8.3。但是,我注意到這兩個回調都沒有被調用。我使用的jsonp服務在這種情況下返回一個400頭文件,我無法找到它來處理它我使用jQuery的客戶端 – 2014-12-03 22:05:11

+0

@Anthony:Jquery 2.x現在支持錯誤處理程序(1.x仍然沒有) – 2014-12-10 18:21:43

4

jquery.ajax有一個替代方式來處理錯誤

jQuery.ajax({ 
     type: "GET", 
     url: 'http://www.example.com/script_test.js', 
     dataType: "script", 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      console.log('error ', errorThrown); 
     }, 
     success:function(){ 
      console.log('success'); 
     } 
    });