Прототип JS проглатывает ошибки в dom:loaded и обратных вызовах ajax?

Я не могу понять, почему прототип подавляет сообщения об ошибках в событии dom:loaded и в обработчиках AJAX.

Учитывая следующий фрагмент 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>

Событие domready срабатывает, я вижу журнал в консоли, но никаких указаний на какие-либо ошибки нет. Если вы переместите строку console.log(idontexist); из обработчика, вы получите

idontexist не определен

ошибка в консоли. Я нахожу это немного странным, что в других обработчиках событий, таких как «щелчок», вы получаете сообщение об ошибке, кажется, что только dom:loaded имеет эту проблему.

То же самое касается обработчиков AJAX:

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

Вы не увидите никаких ошибок. Это с прототипом.js 1.6.1, и я не могу найти никаких указаний на это поведение в документах или способ включить отчеты об ошибках в этих обработчиках.

Я попытался выполнить код с помощью отладчика FireBug, и он, кажется, переходит к функции в строке 53 с именем K, когда обнаруживает отсутствующую переменную в обработчике dom:loaded:

K: function(x) { return x } 

Но как? Почему? Когда? Я не вижу там ни одного блока try/catch, как там оказывается поток программы?

Я знаю, что могу сделать ошибки видимыми, упаковав обработчики dom:ready в блоки try/catch, но это не очень удобный вариант. То же самое касается регистрации глобального обработчика onException для вызовов AJAX.

Почему он вообще подавляет ошибки? Кто-то сталкивался с этим раньше?


person K. Norbert    schedule 23.03.2010    source источник


Ответы (3)


через некоторое время я обнаружил, что прототип перенаправляет все исключения в обработчик 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
    }
});

больше информации здесь

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

onException Запускается всякий раз, когда возникает ошибка XHR. Имеет пользовательскую подпись: первый аргумент — запрашивающая сторона (т. е. экземпляр Ajax.Request), второй — объект исключения.

person kodisha    schedule 30.03.2010
comment
Хотя да, это частичное решение, я упомянул, что хотел бы увидеть решение без регистрации глобального обработчика onException для вызовов AJAX, и это также касается обработчиков для каждого запроса. - person K. Norbert; 31.03.2010

Вы также можете повторно вызвать исключение из onException, и вы получите его так же, как если бы это произошло вне вызова

onException: function(request,e){throw e;}
person iTake    schedule 01.03.2012

Работал на меня

Ajax.Ответчики

Репозиторий глобальных слушателей, уведомляющих о каждом шаге Ajax-запросов на основе прототипа.

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

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});
person 0m3r    schedule 06.11.2012