在DOM Core中定义了标记语言文档的一些通用操作。这个通用操作也就是无论是HTML还是XML或是别的什么,只要是标记语言文档都可以使用的一套API。这套API就是对标记语言的基本概念做了封装。只有搞明白标记语言的本质是什么,才能对这个套API有感觉。
标记语言是因为方便移植才发明的。它可以把抽象的对象用文本描述出来,所以它才方便移植。也就是说,标记语言的本质是文本,是有固定语法的文本。但是对大文本的操作不仅麻烦而且效率低,我们需要的是高效并且方便的东西。所以,操作标记语言的文档,需要先把它对象化,并对这些对象定义一套操作。这就是DOM的Core。
那么,标记语言文档如何对象化呢?这只要按照它本身的语法来解析就行了,每一种语法都是一个nodeType,这些东西就是标记语言的语言成分。要把它们对象化就需要为它们都分配一块内存。另外,标记语言的文档是树形结构的,所以这些成分以树的形式互相关联着。树根是一个文档节点(DocumentNode),整个树就是文档对象模型(DOM)。但是,这个树和我们平时看到的HTML标签树是不同的概念。因为这个树是内存级的,所有标记语言的语言成分都作为这棵树的一个节点(Node)。
既然DOM是树(有序树),那么节点上就应该有树的基本操作。
子节点相关:
appendChild、removeChild、insertBefore、childNodes
父节点相关:
parentNode
同级节点相关:
firstChild、lastChild、previousSibling、nextSibling
这些都是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的文档。
日期:2015年04月11日
标签: 广州网站设计公司 、 广州网站设计 、 广州网站建设公司 、 广州网站建设 、 广州网站制作公司 、 广州网站制作 、 高端网站设计 、 高端网站建设 、 广州高端网站设计 、 广州高端网站建设