2009-09-18 1 views
5

Faccio un sacco di richieste JSON con tag di script dinamici. È possibile rilevare se c'è un errore nella richiesta (ad esempio errore 503, errore 404) ed eseguire qualcosa al rilevamento dell'errore?Tag di script dinamici per richieste JSON ... rilevamento di un errore XXX?

+0

come stai facendo queste richieste JSON? –

+0

Sto usando document.createElement ('script'), cambiando lo src dell'elemento nell'URL desiderato quindi aggiungendo l'elemento al DOM. Ho provato a mettere appendChild in un blocco try/catch, ma questo non fa nulla. – rawrrrrrrrr

+4

È possibile aggiornare la domanda con lo snippet di codice o postare su http://jsbin.com/, è utile per la completezza? –

risposta

11

utilizzare invece ajax. AFAIK non c'è modo di rilevare se un tag script viene caricato o meno, e in caso contrario, perché non è stato caricato. Usando ajax puoi caricare il json e ti dirà perché non è stato caricato.

Utilizzando una libreria come jQuery questo diventa molto semplice:

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "script", 
    error: function(xhr, error, exception){ 
    alert(xhr.status); //Will alert 404 if the script does not exist 
    } 
}); 
+1

Ma ... ma ... c'è un modo. –

4

AFAIK, non c'è modo di accedere al codice di stato di qualche risorsa esterna caricata dal documento (come script, stile o immagine). Anche il rilevamento di errori (tramite, ad esempio, il gestore di eventi onerror) non è ampiamente supportato tra i browser.

Se qualsiasi cosa si sta caricando cade sotto SOP, utilizzare XHR che consente di accedere alle intestazioni di risposta. Altrimenti, puoi provare a esaminare lo X-domain XHR introdotto di recente.

1
+0

Questa sembra essere la soluzione. Se dovessi aggiungere del testo che lo spieghi e/o includere il codice di esempio dalla pagina di riferimento nella risposta, potresti ottenere alcuni upvotes e ricompensarti con la risposta accettata. Il collegamento –

+0

lo spiega praticamente, non voglio inquinare lo spazio con copia/incolla di entropia crescente lol. – Kane

+0

Non trovo questo collegamento rilevante. L'articolo collegato riguarda il rilevamento del caricamento corretto, non il rilevamento degli errori. –

0

Se si desidera rilevare errori, ascoltare un evento error e confrontare la proprietà dell'errore fileName con il nome file dello script. Se corrispondono, gestisci l'errore. Il fatto è, penso che la proprietà fileName sia Firefox e solo Opera. La maggior parte dei browser che hanno uno stacktrace per errori possono anche simulare questo comportamento.

Ecco un esempio, come richiesto da Eric Bréchemier:

var getErrorScriptNode = (function() { 
    var getErrorSource = function (error) { 
     var loc, replacer = function (stack, matchedLoc) { 
      loc = matchedLoc; 
     }; 

     if ("fileName" in error) { 
      loc = error.fileName; 
     } else if ("stacktrace" in error) { // Opera 
      error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer); 
     } else if ("stack" in error) { // WebKit 
      error.stack.replace(/at (.*)/gm, replacer); 
      loc = loc.replace(/:\d+:\d+$/, ""); 
     } 
     return loc; 
    }, 
    anchor = document.createElement("a"); 

    return function (error) { 
     anchor.href = getErrorSource(error); 
     var src = anchor.href, 
     scripts = document.getElementsByTagName("script"); 
     anchor.removeAttribute("href"); 
     for (var i = 0, l = scripts.length; i < l; i++) { 
      anchor.href = scripts.item(i).src; 
      if (anchor.href === src) { 
       anchor.removeAttribute("href"); 
       return scripts.item(i); 
      } 
     } 
    }; 
}()); 
+0

come puoi farlo? qualche esempio? –

+0

Eric: ho aggiunto un esempio. –

3

sto supponendo che si desidera far funzionare tutto questo cross-domain, motivo per cui non è possibile utilizzare XHR?

Provare a creare due tag di script per ogni richiesta, la prima fa la richiesta JSONP standard, la seconda è fondamentalmente un gestore di errori.

Se il primo tag di script viene eseguito, deselezionare il gestore degli errori nella richiamata. Ma se il primo ottiene un 404, verrà eseguito il gestore degli errori all'interno del secondo tag dello script.

Probabilmente si desidera impostare un timeout per far fronte a una risposta JSONP lenta.

0

Se è necessario attraversare domini (e avere bisogno che la pagina funzioni in modo portabile), è necessario utilizzare tag di script dinamici.

Se si ha accesso al server remoto, è possibile passare indietro un codice di errore dal server, e hanno il ritorno pagina del server 200.

Se si ha accesso o meno, si può usare quando si crea setTimeout il tag script, passando una funzione che attiverà un errore se scade prima che venga chiamato il gestore jsonp. Assicurarsi che il gestore jsonp si interrompa se è stato chiamato il gestore errori.

È necessario tenere traccia di ciascuna richiesta tramite una raccolta globale, ma si otterrà la possibilità di annullare e contare le richieste. Questo è simile al modo in cui gli oggetti XHR sono gestiti da una libreria come jQuery.

1

Se si utilizza jQuery, controllare jQuery-JSONP che è un plug-in jQuery che fa un lavoro abbastanza decente di fare l'inserimento <script> per voi così come rilevare errori di recupero.

Citando dalla pagina del progetto, jQuery-JSONP caratteristiche:

  • recupero di errore in caso di guasto della rete o risposte JSON malformati,
  • controllo preciso sulla callback di denominazione e come si è trasmessa nel URL,
  • richieste multiple con lo stesso nome di richiamata in esecuzione contemporaneamente,
  • due meccanismi di caching (basato su browser e la pagina basa),
  • la possibilità di manualmente abo la richiesta è uguale a qualsiasi altra richiesta AJAX,
  • un meccanismo di timeout.
+0

Ma non c'è modo di conoscere il codice di stato effettivo della richiesta non riuscita, vero? – kangax

Problemi correlati