关于DOM的一些说明


25

我一直在尝试了解DOM,尽管我对DOM有一个很清楚的了解,但是有些想法我无法确定。我将列出我认为的DOM,而我的问题将是内联的。

  1. DOM是网页的完全面向对象的表示形式。W3C DOM标准构成了在大多数现代浏览器中实现的DOM的基础。

    那么,DOM是否讨论了如何将XML / HTML文档表示为对象模型?

  2. DOM没有指定必须将文档实现为树或树林,也没有指定如何实现对象之间的关系。

    可以通过其他什么方式表示文档?

  3. 当你做这样的事情-

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

    文档对象由DOM提供。写方法是DOM向JavaScript公开的接口。

    因此,这些对象及其方法由DOM解析器创建为JavaScript对象,然后呈现给JavaScript引擎?还是DOM解析引擎中的对象和方法使用自己的母语?并且暴露给JavaScript引擎?如果是这样,那么负责从JavaScript到本地语言的翻译是什么?

  4. 什么是语言绑定?

    语言绑定是所讨论语言的本机对象集合,用于实现DOM规范中的每个接口。

    开发人员只需遵循DOM规范中的IDL(接口定义语言),就可以创建从DOM到其语言的语言绑定。

    因此,如果DOM解析引擎是用C ++实现的,这是否意味着当您遵循IDL创建语言绑定时,是否只是在使用特定语言(即DOM解析引擎所构建的C ++)创建对象?


@apsillers应该是“那么DOM是否谈论如何将XML / HTML文档表示为对象模型?” 我已经编辑了帖子。
user1720897 2013年

我会在评论中回答。3和4可能会让开发浏览器的人真正回答问题,而我不想影响回答的数量。1-浏览器了解文档的当前状态,可以将其称为DOM,也可以将DOM称为其公开的标准接口,该接口允许您查询和修改文档的状态。
George Mauer 2013年

2-该声明是关于实现的,而不是表示形式。除非我弄错了,否则“表示”必须是一棵树。幕后的实现则没有。
George Mauer 2013年

Answers:


19

接下来是我对相关规范和参考的最佳阅读。(我发现Mozilla 关于DOM级别和相关链接的摘要特别有用。)我鼓励他人进行更正或澄清。

那么,DOM是否讨论了如何将XML / HTML文档表示为对象模型?

是。DOM级别1规范有两个部分- 核心HTML。所述核心 DOM规范描述了一般可能被用于表示任何结构化文档的DOM。在HTML DOM规范描述了如何使用核心DOM具体描述HTML文档,包括特定的HTML界面。

DOM没有指定必须将文档实现为树或树林,也没有指定如何实现对象之间的关系。可以通过其他什么方式表示文档?

DOM Core 确实假定文档是一棵树。该Node接口是“ ...整个[DOM]的主要数据类型。它表示文档树中的单个节点。” Node具有用于访问孩子,兄弟姐妹,和父节点(例如,几个属性parentNodefrstChild暗示树结构等)。您可以使用平面树或线性树(例如,链表),但它仍将是某种形式的树。

正如George Mauer在评论中指出的那样,也许您的意思是特定实现的基础模型不必是一棵树。那是真的。只要您的实现提供DOM规范中承诺的功能,您就可以使用任何喜欢的结构来提供该功能。

DOM解析引擎中的对象和方法是否使用自己的母语?

通常。在大多数浏览器中,DOM是使用诸如C之类的较低级语言实现的,并且浏览器提供了可操作实际表示的JavaScript环境的绑定。实际上,您是否在看“将DOM移入Javascript”的含义?,您会看到Google有兴趣切换到本机JavaScript DOM实现(可能避免同时使用C ++函数该C ++函数的重复JavaScript包装器;也可能是为了提高性能)。

从JavaScript转换为母语的责任是什么?

我对此主题有点困惑,但是我的理解是,当调用JavaScript DOM绑定时,JavaScript执行环境(本身以C之类的低级语言实现)会调用相关的DOM函数(用C / C ++编写)来操作DOM。

如果您想更进一步,则需要与实际制作浏览器的人交谈。

这是否意味着在遵循IDL创建语言绑定时,您只是在以特定语言(即DOM解析引擎所构建的C ++)创建对象?

是。DOM的IDL与语言无关,因此您可以使用任何语言来实现它。“编写DOM实现”是指编写代码(以特定语言)以符合DOM规范中描述的IDL接口。


我认为绑定必须涉及两件事。通过引用和某种方式从本机实现中拾取事件来调用本机运行时。您实际上可以通过控制台通常记录日志的方法来查看哪些方法只是浏览器中的本机代码包装器。例如console.log(document.write);console.log(document.constructor);- .toString()在未提供功能文本的浏览器中添加日志参数。对象在本机代码中不一定具有镜像等效项。同样,大多数DOM对象属性实际上是具有相关行为的吸气剂。
Erik Reppen 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.