7

Ich kann nicht herausfinden, warum der Prototyp die Fehlermeldungen im Ereignis dom:loaded und in AJAX-Handlern unterdrückt.Prototyp JS schluckt Fehler in dom: geladen und Ajax Callbacks?

das folgende Stück HTML Gegeben:

<!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> 

Die domready Ereignis ausgelöst wird, sehe ich das Protokoll in der Konsole, aber es gibt keine Hinweise auf Fehler überhaupt. Wenn Sie die console.log(idontexist); Linie aus dem Handler bewegen, erhalten Sie die

idontexist nicht

Fehler in der Konsole definiert ist. Ich finde es ein wenig komisch, dass in anderen Ereignishandlern, wie "klicken", Sie die Fehlermeldung erhalten, es scheint, dass es nur die dom:loaded ist, die dieses Problem hat.

Das gleiche gilt für AJAX-Handler:

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

Sie keine Fehler sehen. Dies ist mit prototype.js 1.6.1, und ich kann keine Hinweise auf dieses Verhalten in den Dokumenten finden, noch eine Möglichkeit, Fehlermeldungen in diesen Handlern zu aktivieren.

Ich habe versucht, mit Firebug Debugger durch den Code schrittweise, und es scheint zu einer Funktion auf der Linie 53 genannt K, wenn es trifft auf die fehlende Variable in den dom:loaded Handler zu springen:

K: function(x) { return x } 

Aber wie? Warum? Wann? Ich kann dort keinen Try/Catch-Block sehen, wie läuft der Programmfluss dort oben ab?

Ich weiß, dass ich die Fehler sichtbar machen kann, indem ich meine Handler dom:ready in Try/Catch-Blöcke packen, aber das ist keine sehr komfortable Option. Gleiches gilt für das Registrieren eines globalen onException-Handlers für die AJAX-Aufrufe.

Warum unterdrückt es sogar die Fehler? Ist jemand schon einmal darauf gestoßen?

Antwort

5

nach einer Weile fand ich, dass Prototyp alle Ausnahmen zu OnException Handler leitet:

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

weitere Informationen hier

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

OnException ausgelöst, wenn ein XHR Fehler auftritt. Hat eine benutzerdefinierte Signatur: Das erste Argument ist der Requester (d. H. Eine Ajax.Request-Instanz), die Sekunde ist das Ausnahmeobjekt.

+2

Während ja, das eine Teillösung ist, erwähnte ich, dass ich möchte, eine Lösung zu finden, ohne einen globalen OnException Handler Registrierung für die AJAX-Aufrufe, und dies gilt auch für die per- Anforderungshandler. –

2

Sie können auch die Ausnahme von OnException wieder werfen, und Sie werden es auf die gleiche Art und Weise zu erhalten, als ob es außerhalb der Anruf

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

für mich

Ajax.Responders Arbeitete geschah

Ein Repository globaler Listener, die über jeden Schritt prototypbasierter Ajax-Anforderungen benachrichtigt werden.

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

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