Прототип JS глотает ошибки в DOM: загружен и обратные вызовы AJAX? - PullRequest
7 голосов
/ 24 марта 2010

Я не могу понять, почему прототип подавляет сообщения об ошибках в событии 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);
    }
});

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

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

K: function(x) { return x } 

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

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

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

Ответы [ 3 ]

6 голосов
/ 30 марта 2010

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

2 голосов
/ 01 марта 2012

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

onException: function(request,e){throw e;}
0 голосов
/ 06 ноября 2012

работал для меня

Ajax.Responders

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

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

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