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