В чем разница в уровнях DOM и как они взаимосвязаны?
Я часто слышу о "уровне DOM 1", "DOM level 2", "DOM level 3" и "DOM level 4" и понял, что я не знаю разницы между ними или их отношением к каждому из них другие.
Я знаю самые основы - DOM - это Document Object Model, и это то, что обеспечивает доступ к языкам сценариев (в частности, но, насколько я знаю, не ограничиваясь различными версиями ECMAScript, такими как ECMAScript 5.1) для доступа к элементам HTML-документа. (Некоторые сайты, которые я читал, например, dom введение на quirksmode - говорят, что это для любого XML-документа, но HTML является достаточным подмножеством.)
Даты на w3c DOM технических отчетах, по-видимому, подразумевают, что каждый последующий уровень DOM заменяет предыдущие.
К сожалению, лучшая ссылка, которую я нашел для разъяснения, была wikipedia, которая, похоже, говорит то же самое - в разделе стандартизации говорится, что последующие уровни добавлены "дополнительная функциональность, не говоря уже об удалении чего-либо.
Теперь, для моих вопросов, которые могут быть быстрым огнем, но, надеюсь, выражают общее состояние моего невежества:
- Какое отношение одного уровня DOM к другому?
- Являются ли DOM нижнего уровня полными подмножествами DOM более высокого уровня? Удалена ли какая-либо функциональность по мере продвижения уровня DOM? Когда я вижу утверждения типа
The level 1 DOM will work fine on an HTML document
и In the Level 1 DOM, each object, whatever it may be exactly, is a Node
(оба из вставки quirksmode), означает ли это, что такие утверждения верны для уровней 2, 3 и 4? (Все это один и тот же вопрос, просто заданный разными способами)
- Является ссылкой на уровень DOM на самом деле немного больше, чем сокращенный способ того, насколько современный пользовательский агент должен работать для определенной функции?
Очевидно, что я могу изучать каждую спецификацию технических отчетов w3c DOM, но надеялся получить ответы от тех, у кого есть опыт из первых рук. Просто взглянув на раздел изменений спецификации для уровня DOM 3, я вижу, что большинство изменений с 2 по 3 были дополнениями, хотя некоторые из ключевых реализаций в интерфейс Node изменился. Изменились ли эти изменения?
Я хотел бы сделать больше, чем просто кивнуть в следующий раз, когда кто-нибудь скажет мне: "О, этот уровень DOM 2, так что все в порядке", поэтому приветствую любые ссылки, которые я пропустил или из первых рук, которые я не получил из моих исследований.
Ответы
Ответ 1
Во-первых, я свяжу сообщение MDN-запись уровней DOM (выделение в оригинале):
DOM использовался для записи в виде набора уровней. Это уже не так. В настоящее время он поддерживается как DOM Living Standard. На этой странице представлен исторический обзор старых дней.
Это подтверждается в документе W3C под названием " W3C DOM4". Мы могли бы считать, что это означает "DOM Level 4", и предположим, что он добавляет дополнительный уровень DOM, но текст спецификации фактически говорит:
Этот документ опубликован как снимок DOM Living Specification.
Итак, это историческая дискуссия, но все же стоит иметь.
"Уровень DOM" - это набор спецификаций, описывающих объекты, методы и поведение объектов DOM. Более высокие уровни спецификации DOM построены на предыдущих уровнях. Изменения произошли двумя способами:
-
Добавление совершенно новой категории спецификаций (например, уровень 3 добавляет спецификации "Проверка" и "Загрузка и сохранение", которые не существовали на Уровне 2)
-
Модификация существующей категории спецификаций (например, обновление спецификации Core)
Очевидно, что первый тип изменений был чисто аддитивным, а не субтрактивным. Второй вид изменений, по-видимому, был почти исключительно аддитивным, вероятно, потому, что W3C был заинтересован в сохранении обратной совместимости с предыдущими версиями.
Изменения, которые не поддерживают обратную связь, обычно редки и довольно незначительны. Изменение Document.doctype
, которое вы указали, например, было в основном аддитивным. Уровень 3 добавил предложение:
Для документов HTML объект DocumentType может быть возвращен независимо от наличия или отсутствия объявления типа документа в документе HTML.
Это просто дало большую гибкость, чтобы позволить реализациям DOM добавлять в doctype в HTML, когда автор пропустил <!DOCTYPE>
. Единственная функциональность, которая могла бы сломаться, - это способность программно обнаруживать наличие указанного автором типа doctype, что, по-видимому, не особенно ценно.
Вероятно, причина, по которой вы слышали, что кто-то сказал: "О, этот уровень DOM 2, так что все в порядке", потому что уровень DOM 2 более широко поддерживается, чем уровень DOM 3. В некоторых случаях это даже не вопрос о старой поддержке браузера: Firefox отметил их отсутствие поддержки DOM 3 "Загрузка и сохранение" спецификации как WONTFIX. Напротив, все спецификации уровня 2 очень хорошо поддерживаются современными браузерами и пользуются поддержкой гораздо более старых браузеров (поскольку уровень 2 на четыре года старше уровня 3).
Ответ 2
Всего несколько заметок на DOM4, чтобы добавить ответ apsillers:
... На уровне 1 DOM, каждый объект, каким бы он ни был, является Node..., это означает, что такие утверждения верны для уровни 2, 3 и 4?
Это определенная нет. Атрибуты в DOM4 не являются узлами.
DOM4 выполняет ряд важных изменений, не поддерживающих обратную совместимость. Атрибуты не являются изменениями узлов, это большой, если вы не используете javascript или утиный язык. Также document.createElement() в XML-документе создаст элемент в пространстве имен http://www.w3.org/1999/xhtml
, где более ранние уровни создадут элемент без пространства имен. Браузеры давно это сделали, но типичные XML-ориентированные реализации DOM использовали DOM3 и более ранний путь. Это большой сдвиг, если вы переходите от реализации DOM3 к DOM4 в контексте, отличном от браузера.