2009-09-10 14 views
6

La funzione di jQuery getScript non sembra supportare una funzione di callback degli errori. Non riesco a utilizzare il codice di gestione degli errori globale ajax qui, una funzione di errore locale sarebbe l'ideale.Gestione degli errori in jQuery.getScript

Documentazione che la richiamata riceve dati/testo Lo stato non sembra corretto - la richiamata non ottiene nessuno.

Eventuali suggerimenti su come rilevare che una chiamata a getScript non è riuscita (server non disponibile, ad esempio)?

EDIT: appena guardato alla fonte, e sembra che il callback viene richiamato solo in caso di successo, con dati sempre impostati su null e textStatus non definiti (in quanto si tratta di un callback successo solo, presumo). La documentazione è molto scorretta per questa funzione.

risposta

-1

Questo è un po 'di un hack, ma ..

Si potrebbe dichiarare una variabile all'interno degli script di caricare e verificare la presenza di esso dopo aver caricato uno script (assumendo che la completa funzione incendi ancora) :

script_test.js:

var script_test = true; 

E poi:

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

Oppure si può semplicemente provare e vedere se tutto ciò che è in vostro scritto, in realtà esiste - funzioni, variabili, oggetti, ecc


Un modo più generico per fare questo sarebbe l'aggiunta di una funzione di auto-esecuzione all'interno degli script si desidera caricare, e farli eseguire una funzione nello script "principale":

main_script.js:

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

$.getScript("script_test.js"); 

script_test.js:

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

sì, questo è quello che sto facendo attualmente ma come hai detto tu, è un po 'un hack. A proposito, il codice dovrebbe leggere if (typeof script_test !== "undefined") ... psychotik

+0

Sì, è un hack. Hai considerato il mio secondo esempio? E ... non credo che tu abbia bisogno dell'operatore typeof. – roosteronacid

+0

Grazie per il secondo suggerimento. Inoltre, a meno che non vada veramente fuori di testa, avrai bisogno di typeof se il var non è già stato definito da nessuna parte. Prova a eseguire questa funzione in basso nel tuo script (non fare menzione di foo prima). Noterai un errore nella console js: function test() {if (foo === undefined) alert ("Yay!"); } – psychotik

5

Il JQuery Ajax-ErrorHandler globale funzionerà!

Prima di $ .getScript-Call impostare il gestore degli errori per memorizzare l'errore.

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

Come descritto nel manuale JQuery: http://api.jquery.com/ajaxError/.

26

A partire da jQuery 1.5 è possibile aggiungere un .fail alla chiamata a getScript.

$.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

Il callback 'fail' non sembra funzionare se lo script è un url tra domini (nemmeno il callback' always' o il gestore globale 'ajaxError'. –

+3

Il callback' fail' funziona con URL tra domini in jQuery 2.0+ – tee

17

per il cross tag script di dominio, gli incendi successo dell'evento, ma l'evento di errore non lo fa; non importa quale sintassi usi.Si può provare questo approccio:

  1. Creare un gestore di errori e impostarla a fuoco dopo pochi secondi utilizzando handle = window.setTimeout
  2. All'interno della vostra funzione di successo di callback, annullare il timeout usando window.clearTimeout(handle)

codice di esempio:

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

Inizialmente questa sembra essere una soluzione abbastanza brutta, ma è l'unica che funziona effettivamente con gli adblockers, quindi grazie per questo! – devsnd

+0

Mi piacerebbe sapere se questo è stato risolto in una versione più recente di jQuery Sto notando questo e sto usando jQuery 1.8.3 Tuttavia, sto notando che non viene richiamato neanche il callback. In questo caso, il servizio jsonp che sto usando restituisce un header 400. Non riesco a trovare comunque il modo di gestirlo il client quando utilizzo jQuery. –

+0

@Anthony: Jquery 2.x supporta i gestori di errori ora (1.x non funziona ancora) –

4

jquery.ajax ha un modo alternativo per gestire errore

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'); 
     } 
    });