Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

浅谈DOM的Core与标记语言文档结构

  在DOM Core中定义了标记语言文档的一些通用操作。这个通用操作也就是无论是HTML还是XML或是别的什么,只要是标记语言文档都可以使用的一套API。这套API就是对标记语言的基本概念做了封装。只有搞明白标记语言的本质是什么,才能对这个套API有感觉。
  标记语言是因为方便移植才发明的。它可以把抽象的对象用文本描述出来,所以它才方便移植。也就是说,标记语言的本质是文本,是有固定语法的文本。但是对大文本的操作不仅麻烦而且效率低,我们需要的是高效并且方便的东西。所以,操作标记语言的文档,需要先把它对象化,并对这些对象定义一套操作。这就是DOM的Core。
  那么,标记语言文档如何对象化呢?这只要按照它本身的语法来解析就行了,每一种语法都是一个nodeType,这些东西就是标记语言的语言成分。要把它们对象化就需要为它们都分配一块内存。另外,标记语言的文档是树形结构的,所以这些成分以树的形式互相关联着。树根是一个文档节点(DocumentNode),整个树就是文档对象模型(DOM)。但是,这个树和我们平时看到的HTML标签树是不同的概念。因为这个树是内存级的,所有标记语言的语言成分都作为这棵树的一个节点(Node)。
  既然DOM是树(有序树),那么节点上就应该有树的基本操作。
    子节点相关:
      appendChildremoveChildinsertBeforechildNodes
    父节点相关:
      parentNode
    同级节点相关:
      firstChildlastChildpreviousSiblingnextSibling
  这些都是Node上的东西,Node主要就是提供这些树的基本操作。当然Node还有类型的区分,比如文本节点上调用appendChild就会抛出异常,因为文本节点被定义为不能添加子节点。
  如果只有这棵内存数,在实际应用上会很不方便。节点的类型有这么多,每一种节点都有自己的功能。我们在用文本写标记语言时是以标签为单位的吧?文本节点、属性节点,等这些东西都是属于某个元素上的吧?所以为了更贴近标记语言本身的逻辑,我们还需要把内存的节点封装成元素(Element)。这个过程是从一棵内存树中抽象出另一棵逻辑树。把最接近内存树的根的那个元素节点(ElementNode)作为逻辑树的根节点,内存树的其它元素节点作为逻辑树的其它所有节点,并保持它们之间原有的关系。对于非元素节点则作为逻辑树中原本所属的Element的属性(Property)。这样,我们看到的树就清一色的是Element了,这才是是我们平时看到的HTML标签树的概念。
  封装了这个逻辑树,就可以避免大部分的非法操作。比如上面说的给文本节点添加子节点的操作。因为这个逻辑树中文本节点是作为节点的一个属性(Property),不把它当做节点当然就不会产生节点非法操作的异常。对于原来的属性节点(AttributeNode)在,它被变成了节点的属性(Attribute),并提供一些列的属性操作。(注意attributes属性是直接继承于Node的而不是Element)
    getAttribute
    setAttribute
    removeAttribute
  由于整棵树的节点都是Element,所以他们都有标签名(TagName),因此还提供了“getElementsByTagName”方法用来按标签名搜索元素。
  以上这些是对DOM Core的简单介绍,我省略了很多不常用的东西。真正的东西比这多的多,要了解这些对象具体的属性和方法应该直接看W3C的文档。

  参考:
    DOM Level 2 Core   
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^