Несколько разъяснений по поводу DOM

25

Я пытался понять DOM, и хотя у меня есть четкое представление о том, что это такое, есть определенные идеи, которые я просто не могу определить. Я перечислю то, что я думаю о DOM, и мои вопросы будут встроены.

  1. DOM - это полностью объектно-ориентированное представление веб-страницы. Стандарт W3C DOM лежит в основе DOM, реализованной в большинстве современных браузеров.

    Так говорит ли DOM о том, как документ XML / HTML представляется в виде объектной модели?

  2. В DOM не указывается, что документы должны быть реализованы в виде дерева или рощи, и при этом не указывается, как должны реализовываться взаимосвязи между объектами.

    Какими еще способами может быть представлен документ?

  3. Когда вы делаете что-то вроде этого -

    document.write('welcome to my home page!');

    объект документа предоставляется DOM. Методы записи - это интерфейсы, предоставляемые DOM для JavaScript.

    Таким образом, объекты и его методы создаются как объекты JavaScript анализатором DOM, а затем представляются движку JavaScript? Или объекты и методы в механизме синтаксического анализа DOM на своем родном языке? И подвергается ли движок JavaScript? Если это так, то что отвечает за перевод с JavaScript на родной язык?

  4. Какие языковые привязки?

    Привязка языка - это набор объектов, родных для рассматриваемого языка, который реализует каждый из интерфейсов в спецификации DOM.

    Разработчики могут создавать привязки языка из DOM к своему языку, просто следуя IDL (Язык определения интерфейса) в спецификации DOM.

    Таким образом, если механизм синтаксического анализа DOM реализован, скажем, на C ++, означает ли это, что когда вы создаете языковые привязки, следуя IDL, вы просто создаете объекты на определенном языке, то есть C ++, на котором построен ваш механизм синтаксического анализа DOM?

user1720897
источник
@apsillers Должно было быть «Так говорит ли DOM о том, как документ XML / HTML представляется в виде объектной модели?» Я редактировал пост.
user1720897
Я отвечу, что я могу в комментариях. 3 и 4 могут заставить кого-то, кто разрабатывает браузеры, действительно ответить, и я не хочу влиять на количество ответов. 1 - браузер понимает текущее состояние документа, вы можете назвать это DOM, или вы можете назвать DOM стандартными интерфейсами, которые он предоставляет, которые позволяют запрашивать и изменять состояние документа.
Джордж Мауэр
2 - Заявление о реализации, а не о представлении. Если я не ошибаюсь, «представление» должно быть деревом. Закулисной реализации нет.
Джордж Мауэр

Ответы:

19

Далее следует мое лучшее прочтение соответствующих спецификаций и ссылок. (Я считаю, что тезисы Mozilla об уровнях DOM и связанных ссылках особенно полезны.) Я рекомендую исправления или разъяснения от других.

Так говорит ли DOM о том, как документ XML / HTML представляется в виде объектной модели?

Да. Спецификация DOM Level 1 состоит из двух частей - Core и HTML . Основные спецификации DOM описывают общую модель DOM , которые могут быть использованы для представления любого структурированного документа. Спецификация HTML DOM описывает, как использовать Core DOM для конкретного описания документов HTML, и включает специфичные для HTML интерфейсы.

В DOM не указывается, что документы должны быть реализованы в виде дерева или рощи, и при этом не указывается, как должны реализовываться взаимосвязи между объектами. Какими еще способами может быть представлен документ?

DOM Ядро делает предположить , что этот документ является деревом. NodeИнтерфейс является «... основным типом данных для всего [DOM]. Он представляет собой единый узел в дереве документаNodeимеет несколько свойств для доступа детей, брата или сестры, и родительских узлов (например, parentNode, frstChildи т.д.) , что подразумевает структуру дерева. Вы можете использовать плоское дерево или линейное дерево (например, связанный список), но все равно это будет некая форма дерева.

Как отмечает Джордж Мауэр в комментариях, возможно, вы имеете в виду, что базовой моделью конкретной реализации не обязательно должно быть дерево. Это правда! до тех пор, пока ваша реализация обеспечивает функциональность, обещанную в спецификации DOM, вы можете использовать любую структуру, которая вам нравится, для обеспечения этой функциональности.

Являются ли объекты и методы в механизме синтаксического анализа DOM их собственным родным языком?

Вообще-то да . В большинстве браузеров DOM реализован на языке более низкого уровня, таком как C, и браузер предоставляет привязки к среде JavaScript, которые могут манипулировать фактическими представлениями. На самом деле, если вы посмотрите на вопрос «Перевод DOM в Javascript»? вы увидите, что Google заинтересован в переходе на собственную реализацию DOM JavaScript (вероятно, во избежание необходимости использовать и функцию C ++, и дублирующую оболочку JavaScript для этой функции C ++; возможно, также для повышения производительности).

что отвечает за перевод с JavaScript на родной язык?

Я немного опасен в этом вопросе, но, насколько я понимаю, когда вызывается привязка DOM JavaScript, среда выполнения JavaScript (которая сама реализуется на языке более низкого уровня, например C) делает вызов соответствующей функции DOM (написано на C / C ++) для управления DOM.

Если вы хотите пойти глубже, вам нужно поговорить с кем-то, кто на самом деле делает браузеры.

Означает ли это, что когда вы создаете привязки к языку, следуя IDL, вы просто создаете объекты на определенном языке, то есть C ++, на котором построен ваш механизм синтаксического анализа DOM?

Да. IDL DOM не зависит от языка, поэтому вы можете реализовать его на любом языке. «Написание реализации DOM» означает написание кода (на определенном языке) для соответствия интерфейсам IDL, описанным в спецификациях DOM.

apsillers
источник
Я считаю, что привязки должны включать две вещи. Вызов собственной среды выполнения с помощью ссылок и некоторый способ извлечения событий из собственной реализации. На самом деле вы можете увидеть, какие методы являются просто оболочками кода в браузерах, обычно регистрируя их в консоли. например, console.log(document.write);или console.log(document.constructor);- добавить .toString()параметр журнала в браузеры, которые не дают вам текст функции. Объекты не обязательно имеют зеркальный эквивалент в нативном коде. Кроме того, большинство свойств объекта DOM на самом деле являются геттерами со связанным поведением.
Эрик Реппен