7

Non riesco a capire perché il prototipo sopprima i messaggi di errore nell'evento dom:loaded e nei gestori AJAX.Il prototipo JS ingerisce gli errori in dom: caricati e callback ajax?

Dato il seguente pezzo di codice HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Conforming XHTML 1.1 Template</title> 
     <script type="text/javascript" src="prototype.js"></script> 
     <script type="text/javascript"> 
      document.observe('dom:loaded', function() { 
       console.log('domready'); 
       console.log(idontexist); 
      }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

L'evento domready, vedo il registro nella console, ma non v'è alcuna indicazione di eventuali errori di sorta. Se si sposta la linea console.log(idontexist); fuori del gestore, si ottiene l'idontexist

non è definito

errore nella console. Trovo un po 'strano, che in altri gestori di eventi, come "click", si ottiene il messaggio di errore, sembra che sia solo il dom:loaded che ha questo problema.

Lo stesso vale per i gestori di AJAX:

new Ajax.Request('/', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(youwontseeme); 
    } 
}); 

Non vedrete gli eventuali errori. Questo è con prototype.js 1.6.1, e non riesco a trovare alcuna indicazione di questo comportamento nei documenti, né un modo per abilitare la segnalazione degli errori in questi gestori.

ho provato passando attraverso il codice con il debugger di Firebug, e sembra per passare a una funzione sulla linea 53 di nome K, quando incontra la variabile mancante nel gestore dom:loaded:

K: function(x) { return x } 

Ma come? Perché? Quando? Non riesco a vedere nessun blocco try/catch lì, come finisce il flusso del programma?

So che posso rendere visibili gli errori comprimendo il mio gestore dom:ready nei blocchi try/catch, ma questa non è un'opzione molto comoda. Lo stesso vale per la registrazione di un gestore globale onException per le chiamate AJAX.

Perché sopprime persino gli errori? Qualcuno l'ha già incontrato prima?

risposta

5

dopo un po 'ho scoperto che il prototipo reindirizza tutte le eccezioni al gestore onException:

new Ajax.Request('/ajax_html_echo', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(undefinedVar) 
    }, 
    onException: function(request,e){ 
     console.log(e.message); // prints undefinedVar is not defined 
    } 
}); 

maggiori informazioni qui

http://www.prototypejs.org/api/ajax/options

onException attivato ogni volta che si pone un errore XHR . Ha una firma personalizzata: il primo argomento è il richiedente (vale a dire un'istanza Ajax.Request), il secondo è l'oggetto eccezione.

+2

Mentre sì, questa è una soluzione parziale, ho detto che mi piacerebbe vedere una soluzione senza registrarti un gestore onException globale per il chiamate AJAX, e questo vale anche per il per- gestori di richieste. –

2

È possibile anche ri-generare l'eccezione da onException e avrete nello stesso modo come se fosse successo al di fuori della chiamata

onException: function(request,e){throw e;} 
0

funzionato per me

Ajax.Responders

Un repository di listener globali ha informato su ogni passaggio delle richieste Ajax basate su Prototype.

http://api.prototypejs.org/ajax/Ajax/Responders/

Ajax.Responders.register({ 
    onCreate: function() { 
    Ajax.activeRequestCount++; 
    }, 
    onComplete: function() { 
    Ajax.activeRequestCount--; 
    } 
});