7

Je n'arrive pas à comprendre pourquoi le prototype supprime les messages d'erreur dans l'événement dom:loaded et dans les gestionnaires AJAX.Prototype JS avale des erreurs dans les rappels dom: loaded et ajax?

Compte tenu de la pièce suivante de 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'événement se déclenche domready, je vois le journal dans la console, mais il n'y a aucune indication de toute erreur que ce soit. Si vous déplacez la ligne console.log(idontexist); hors du gestionnaire, vous obtenez le

idontexist n'est pas défini

erreur dans la console. Je trouve un peu bizarre, que dans d'autres gestionnaires d'événements, comme 'click', vous obtenez le message d'erreur, il semble que c'est seulement le dom:loaded qui a ce problème.

va de même pour les gestionnaires AJAX:

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

Vous ne verrez pas les erreurs. Ceci est avec prototype.js 1.6.1, et je ne trouve aucune indication de ce comportement dans les documents, ni un moyen d'activer le rapport d'erreurs dans ces gestionnaires.

J'ai essayé pas à pas dans le code avec le débogueur de Firebug, et il semble passer à une fonction sur la ligne 53 du nom de K, lorsqu'il rencontre la variable manquante dans le gestionnaire dom:loaded:

K: function(x) { return x } 

Mais comment? Pourquoi? Quand? Je ne vois pas de bloc try/catch là-bas, comment le flux du programme finit-il là?

Je sais que je peux rendre les erreurs visibles en emballant mes gestionnaires dom:ready dans les blocs try/catch, mais ce n'est pas une option très confortable. Il en va de même pour l'enregistrement d'un gestionnaire global onException pour les appels AJAX.

Pourquoi supprime-t-il même les erreurs? Est-ce que quelqu'un a déjà rencontré ça?

Répondre

5

après un certain temps je trouve que le prototype redirige toutes les exceptions au gestionnaire 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 
    } 
}); 

plus d'infos ici

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

onException Déclenché chaque fois qu'une erreur XHR se pose. Possède une signature personnalisée: le premier argument est le demandeur (c'est-à-dire une instance Ajax.Request), la seconde est l'objet d'exception.

+2

Alors oui, c'est une solution partielle, je l'ai mentionné que je voudrais voir une solution sans l'enregistrement d'un gestionnaire global OnException pour les appels AJAX, et cela vaut aussi pour le per- gestionnaires de requêtes. –

2

Vous pouvez également re-jeter l'exception de onException et vous aurez de la même manière que si cela se produisait en dehors de l'appel

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

travaillé pour moi

Ajax.Responders

Référentiel d'écouteurs globaux notifié à chaque étape des requêtes Ajax basées sur le prototype.

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

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