Поскольку IE – наиболее широко используемый веб_броузер, несколько особых замечаний о его соответствии спецификациям DOM будут здесь вполне уместны. IE 5 и более поздние версии достаточно хорошо поддерживают модули Core и HTML Level 1, чтобы запускать примеры из этой главы, а также ключевые особенности модуля CSS Level 2, чтобы запускать большинство примеров из главы 16. К сожа_ лению, IE версий 5, 5.5 и 6 не поддерживает модуль Events модели DOM Level 2, хотя корпорация Microsoft участвовала в определении этого модуля и имела дос_ таточно времени для его реализации в IE 6. Отсутствие в IE поддержки стандарт_ ной модели обработки событий затрудняет создание развитых клиентских веб_ приложений.
Хотя IE 6 заявляет (через свой метод hasFeature()) о поддержке интерфейсов Core и HTML стандарта DOM Level 1, фактически эта поддержка неполна. Наиболее во_ пиющая проблема, с которой вы, скорее всего, столкнетесь, – небольшая, но не_ приятная: IE не поддерживает константы типов узлов, определяемых в интер_ фейсе Node. Вспомните, что каждый узел в документе имеет свойство nodeType, за_ дающее тип данного узла. Спецификация DOM также утверждает, что интерфейс Node определяет константы, представляющие каждый из определяемых им типов узлов. Например, константа Node.ELEMENT_NODE представляет узел Element. В IE (по крайней мере, до версии 6 включительно) эти константы просто не существуют.
В этой главе примеры изменены так, чтобы обойти это препятствие. Они содер_ жат целочисленные литералы вместо соответствующих символических кон_ стант. Например:
if (n.nodeType == 1 /*Node.ELEMENT_NODE*/) // Проверяем, является ли n объектом Element
332 Глава 15. Работа с документами
Хороший стиль программирования требует, чтобы в программный код помеща_ лись константы, а не жестко определенные целочисленные литералы, и те, кто захочет сделать код переносимым, могут включить в программу следующий код для определения констант, если они отсутствуют:
if (!window.Node) {
var Node = {
// Если объект Node отсутствует, определяем
ELEMENT_NODE: 1,
// его со следующими
свойствами и значениями.
ATTRIBUTE_NODE: 2, // Обратите внимание, здесь только типы HTML_узлов