第10章 DOM

321 阅读6分钟

DOM文档对象模型,针对HTML和XML的一个API。

DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面中的某一部分。

节点层次

文档节点:每个文档的根节点。

一般来说一个网页,文档节点只有一个子节点——<html>元素,我们称之为文档元素。文档元素是文档的最外层元素,一个文档只有一个。在HTML页面中,文档元素始终是<html>元素。在XML中没有预定义,所以任何元素都能成为文档元素。

Node 类型

JavaScript所有节点类型都继承Node类型,因此所有节点都共享相同的属性和方法(一般属性在构造函数中,方法在原型中):

  • nodeType属性,用于表命节点的类型。节点类型由12个数值常量表示。
  • nodeName和nodeValue属性:对于元素节点,nodeName始终是元素的标签名。
  • childNodes:子节点集,其中保存着NodeList对象。NodeList是一种类数组对象,用于保存一组有序的节点,可以通过[]或者item()访问这些节点。同时也有length属性。childNodes会实时变化,具体以每次访问为准。可以把NodeList像转为Array对象:

var arrayNodes=Array.prototype.slice.call(someNode.childNodes,0);

是Array原型对象上的方法,其实和直接调用只是this绑定的区别。

  • parentNode:指向父节点。
  • previousSibling、nextSibling:同胞节点。
  • firstChild、listChild:同childNode[0]、childNodes[someNode.childNodes.length-1]
  • hasChildNodes()方法:如果存在子节点,返回true。
  • ownerDocument:指向文档节点。任何节点不能同时存在于两个或多个文档中。
  • appendChild():像childNodes列表的末尾新增一个节点,并返回新增的节点。如果传入的节点本来就是文档的一部分,那么从原来位置移到新位置。任何DOM节点不能同时出现在文档多个位置上。
  • insertBefore():放在childNodes某个特定的位置。第一个参数为插入的节点,第二个节点为参照节点。插在参照节点前面,同时返回该节点。如果参照节点为null,则和appendChild()方法一样。
  • replaceChild():两个参数:要插入的节点和要替换的节点。返回被替换的节点。该节点所有关系指针都会被复制过来。尽管从技术上讲该节点任在文档中,只是没了自己的位置。
  • removeChild():移除节点,并返回该节点。也是在文档中,只是没了位置。
以上几个方法,必须先取得父节点。如果在没有子节的节点上使用,会出错。
  • cloneNode():用于创建调用这个方节点的完全相同的副本。参数为true深复制,复制节点及其整个子节点树。参数为false,则只复制本身,返回的节点为文档所有,但并没有给它指定父节点,所有它是孤儿。可以通过上面的方法插入,使其有自己的位置。(这里的深浅复制和ECMAScript中的不一样)只复制特性和(true时候)字节点。
  • normallize():处理文档树中的文本节点。删除空的,合并相邻的。

Document 类型

document对象是HTMLDocument类型(继承自Document类型)的一个实例,表示整个HTML页面。同时document也是window的一个属性,因此可以作为全局对象访问。可以取得页面有关的信息,并且能操作页面的外观和底层结构。

  • nodeName:#document
  • nodeType:9
  • parentNode:null
  • ownerDocument:null
属性与方法:
  • doucumentElement:一般来说document只有<html>一个元素子节点。
  • body:指向<body>元素。为了便于开发。
  • doctype:除了<html>外另一个可能的子节点,指向<!DOCTYPE>,不常用
  • title:指向<title>元素
网页请求相关:
  • URL、domain、referrer:只有domain是可以设置的,其他都只读。设置域名也只能包含关系设置。
查找元素:
  • getElementById():接受一个参数,要取得元素的ID,找到并返回该元素,不存在返回null。如果页面中多个ID相同,只返回第一个。
  • getElementByTagName():接受一个参数,要取得的元素的标签名。返回包含零或多个元素的nodeList。HTML中则会返回HTMLCollection对象,作为一个动态的集合,该对象与nodeList相似。HTMLCollection有一个namedItem(),能根据name特性取得集合中的项。可以用"*"作为参数,取得页面所有元素。
  • getELementByName():参数为name特性值。返回的也是HTMLCollection,用namedItem()获取某一项时,只返回第一项,因为所有name相同。
特殊集合:

document.anchor、document.link、document.forms、document.images,都是HTMLCollection对象,随着页面的变动,动态变化。

文档写入: 

write()、writeln():接受字符串参数,动态地插入页面代码,写在哪里就插在哪里。

open()、close()

如果在文档加载后再调用write()则会重写整个页面。

Element 类型

  • nodeType:1
  • nodeName:标签名,也可用tagName访问,这里要大写
  • nodeValue:无
  • parentNode:Element或Document
  • 子节点:Element、注释、文本……
关于特性:
每个非自定义的特性值,都有对应的属性。(注:class对应的为className)。
  • getAttribute():返回特性值。常用
  • getAttributeNode():返回特性节点。
  • SetAttribute():给元素设置特性,常用
  • removeAttribute()
  • attributes属性:是个类NodeList,里面是一个个Attr节点
  • getElementByTagName():获取相应标签的子元素,子子元素
  • document.creatElement():注意要加到文档中。

Text 类型

  • nodeType:3
  • nodeName:”#text“
  • nodeValue:文本内容,或data
注意空格也是文本。一般来说一个元素内只有一个文本,但通过DOM技术可以有多个,可以在父元素用normalize()合并。
  • splitText():分割nodeValue,留下旧的返回新的。
  • creatTextNode():创建,注意要加到文档中。

Comment 类型

除了没有splitText()方法,和Text类型类似。

CDATASection 类型

只基于XML。除了没有splitText()方法,和Text类型类似。

DocumentType 类型

doctype有关信息。

DocumentFragment 类型

轻量级文档。可以用来暂存一些元素,然后一次性插入document文档中。

Attr 类型

  • nodeType:2
  • nodeName:特性名,name
  • nodeValue:特性值,value
  • 没有父节点,没有子节点。
  • specified属性

建议直接配合元素的特型方法使用。

DOM操作技术

需要多次使用的功能,可以考虑用函数。

动态添加外部js文件

function loadScriptout(url){    var script=document.createElement("script");    script.type="text/javascript";    script.src=url;    document.body.appendChild(script);}loadScriptout("../js/day1.js")

动态添加内部js:

function loadScript(code){    var script=document.createElement("script");    script.type="text/javascript"    try{        script.appendChild(document.createTextNode(code));    }    catch(ex){        script.text=code;    }    document.body.appendChild(script);}var code1="alert('ni')"loadScript(code1);

动态添加外部style:与js相似

动态添加内嵌style:与js相似,注意样式文本写在styleSheet属性的cssText属性中。

操作表格相关 p282