Исторически сложилось так, что обработчику события
опеrror
объекта
Window
передается три строковых аргумента, а не единственный объект события, как в других обработчиках. (Другие объекты в клиентском JavaScript также имеют обработчики
onerror
, обрабатывающие различные ошибочные ситуации, но все они являются обычными обработчиками событий, которым передается единственный объект события.) Первый аргумент обработчика
window.опеrror
– это сообщение, описывающее произошедшую ошибку.
Второй аргумент - это строка, содержащая URL-адрес документа с JavaScript-кодом, приведшим к ошибке. Третий аргумент - это номер строки в документе, где произошла ошибка.
Помимо этих трех аргументов важную роль играет значение, возвращаемое обработчиком
опеrror
. Если обработчик
опеrror
возвращает
true
, это говорит броузеру о том, что ошибка обработана и никаких дальнейших действий не требуется; другими словами, броузер не должен выводить собственное сообщение об ошибке. К сожалению, по историческим причинам в Firefox обработчик ошибок должен возвращать true, чтобы сообщить о том, что ошибка обработана.
Обработчик
оnеrror
является пережитком первых лет развития JavaScript, когда в базовом языке отсутствовала инструкция
try/catch
обработки исключений. В современном программном коде этот обработчик используется редко. Однако на время разработки вы можете определить свой обработчик ошибок, как показано ниже, который будет уведомлять вас о всех происходящих ошибках:
// Вывести сообщение об ошибке в виде диалога, но не более 3 раз
window.опеrror = function(msg, url, line) {
if (опеrror.num++ < опеrror.max) {
alert("ОШИБКА: " + msg + "\n" + url + + line):
return true;
}
}
опеrror.max = 3;
опеrror.num = 0;
14.7. Элементы документа как свойства окна
Если для именования элемента в HTML-документе используется атрибут
id
и если объект
Window
еще не имеет свойства, имя которого совпадает со значением этого атрибута, объект Window получает неперечислимое свойство с именем, соответствующим значению атрибута
id
, значением которого становится объект
HTMLElement
, представляющий этот элемент документа.
Как вы уже знаете, объект
Window
играет роль глобального объекта, находящегося на вершине цепочки областей видимости в клиентском JavaScript. Таким образом, вышесказанное означает, что атрибуты
id
в HTML-документах становятся глобальными переменными, доступными сценариям. Если, например, документ включает элемент
<button id='okay”/>,
на него можно сослаться с помощью глобальной переменной
okay
.
Однако важно отметить, что этого не происходит, если объект
Window
уже имеет свойство с таким именем. Элементы с атрибутами
id
, имеющими значение
«history», «location»
или
«navigator»,
например, не будут доступны через глобальные переменные, потому что эти имена уже используются. Аналогично, если HTML-документ включает элемент с атрибутом
id
, имеющим значение «х» и в сценарии объявляется и используется глобальная переменная х, явно объявленная переменная скроет неявную переменную, ссылающуюся на элемент. Если переменная объявляется в сценарии, который в документе находится выше именованного элемента, наличие переменной будет препятствовать появлению нового свойства окна. А если переменная объявляется в сценарии, который находится ниже именованного элемента, первая же инструкция присваивания значения этой переменной затрет значение неявно созданного свойства.
В разделе 15.2 вы узнаете, что с помощью метода
document.getElementByld
можно отыскивать элементы документа по значениям их HTML-атрибутов
id
. Взгляните на следующий пример:
var ui = ["input","prompt","heading"]; // Массив идентификаторов элементов
ui.forEach(function(id) { // Отыскать элемент для каждого id
ui[id] = document.getElementById(id); // и сохранить его в свойстве
});
После выполнения этого фрагмента свойства
ui.input, ui.prompt
и
ui.heading
будут ссылаться на элементы документа. Вместо
ui.input
и
ui.heading
сценарий мог бы использовать глобальные переменные input и heading. Но, как вы помните из 14.5, объект
Window
имеет метод с именем
prompt,
поэтому сценарий не сможет использовать глобальную переменную
prompt
вместо свойства
ui.prompt
.
Неявное использование идентификаторов элементов в качестве глобальных переменных - это пережиток истории развития веб-броузеров. Эта особенность необходима для сохранения обратной совместимости с существующими веб-страницами, но использовать ее сейчас не рекомендуется - в любой момент производители броузеров могут определить новое свойство в объекте
Window
, что нарушит работу любого программного кода, использующего неявно определяемое свойство с этим именем. Поиск элементов лучше выполнять явно, с помощью метода
document.getElementById.
А его использование будет менее трудоемким, если дать ему более короткое имя: