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
- 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属性中。