十
DOM
1.节点层次
//每个节点都拥有各自的特点,数据和方法
节点也与其他节点存在关系,节点间的关系构成了层次,
所有的页面标记则表现为一个特定节点为根节点的树形结构
例
Hello World
//在此里中,文档节点只有一个子节点,即元素
我们称之为文档元素。
Node类型
DOM1级定义一个Node接口,js中的所有节点类型都继承自Node
类型,因此所有的节点类型都共享着相同的基本属性和方法。
每个节点都有一个nodeType属性,属于表明节点的类型
节点类型由在Node类型中定义的12个数值常量来表示。
Node.ELEMENT_NODE(1);
Node.ATTRIBUTE_NODE(2);
Node.TEXT_NODE(3);
Node.CDATA_SECTION_NODE(4);
通过比较上面这些常量,可以很容易的确定节点的类型
例
if(someNode.,nodeType==Node.ELEMENT_NODE){//在IE中无效
alert("Node is an element");
}
//若二者相等,则意味着someNode确实是一个元素
if(someNode.nodeType==1){//适用于所有的浏览器
alert("Node is an element");
}
1.nodeName和nodeValue属性
了解节点的具体信息可用,其值完全取决于节点的类型
//检验节点类型
if(someNode.nodeType==1){//适用与所有的浏览器
value=someNode.nodeName;//nodeName的值是元素的标签名
}
//对于元素节点,nodeName中保存的始终都是元素的标签名,而nodeValue的值则始终为Null.
2.节点关系
每个节点都有一个childNodes属性,其中保存这一个NodeList对象,
NodeList是一种类数组对象,用来保存一组有序的节点。
NodeList对象也有length属性,但他不是Array的实例。
//访问保存在NodeList中的节点——可以通过方括号,也可以使用item[]方法。
var firstChild=someNode.childNodes[0];
var secondChild=someNode.childNodes.item[1];
var count=someNode.childNode.length;
//对arguments对象使用Array.prototype.slice[]方法可以将其转换为数组。
//将NodeList对象转换为数组
var arrayOfNodes=Array.prototype.slice.call(someNode.childNodes,0);
在IE8及更早版本中,要想在IE中将NodeList转换为数组,必须手动枚举所有的成员
function convertToArray(nodes){
var array=null;
try{
array=Array.prototype.slice.call(node,0);//针对非IE浏览器
}catch(ex){
array=new Array();
for(var i=0,len=nodes.length;i
}
}
return array;
}//这也是另一种检测怪癖的形式。
包含在childNodes列表中的所有节点都具有相同的父节点,故其parentNode属性都指向同一节点
使用previousSibling和nextSibling属性,可以访问同一列表中的其他节点。
第一个节点的previousSibling属性值为null,而列表中最后的一个节点的nextSibling属性值也为null
例
if(someNode.nextSibling===null){
alert("Last node in the parent's childNodes list");
}else if(someNode.previousSibling===null){
alert("First node in the parenthildNodes list");
}
父节点的firstChild和lastChild属性分别指向其childNodes列表中的第一个和最后一个节点
someNode.firstChild的值始终等于someNode.childNodes[0],
someNode.lastChild的值始终等于someNode.childNodes[someNode.childNodes.length-1].
若没有子节点,那么firstChild和lastChild的值均为null。
操作节点
appendChild()方法,用于向childNodes列表的末尾添加一个节点。
添加节点后,childNodes的新增节点,父节点及以前的最后一个节点的关系指针都会得到相应的更新。
例
var returnedNode=someNode.appendChild(newNode);
alert(returnedNode==newNode);//true;
alert(someNode.lastChild==newNode);//true;
//任何DOM节点也不 能同时出现在文档中的多个位置上
故调用appendChild()时传入了父节点的第一个子节点,
则该节点就会成为父节点的最后一个子节点
例
var returnedNode=someNode.appendChild(someNode.firstChild);
alert(returnedNode==someNode.firstChild);//false
alert(returnedNode==someNode.lastChilld);//true;
把节点放在childNodesl列表中某个特定的位置上,而不是放在末尾,那么可以使用
insertBefore()方法,
这个方法接受两个参数:要插入参数的节点和作为参照的节点
插入节点后,被插入的节点会变成参照节点的前一个同胞节点返回。
若参照节点是null,则insertBefore()与appendChild()执行相同的操作。
//插入后成为最后一个子节点
returnedNode=someNode.insertBefore(newNode,null);
alert(newNode==someNode.lastChild);//true
//插入后成为第一个子节点
var returneNode=someNode.insertBefore(newNode,someNode.firstChild);
alert(returnedNode==newNode);//true
alert(newNode==someNode.firstChild);//true
//插入到最后一个子节点前面
returnedNode=someNode.insertBefore(newNode,someNode.lastChild);
alert(newNode==someNode.childNodes(someNode.childNodes.length-2));//true
replaceChild()方法参数是:要插入的节点和要替换的节点
例
//替换第一个子节点
var returnedNode=someNode.replaceChild(newNode,someNode.firstChild);
//替换最后一个节点
returnedNode=someNode.replaceChild(newNode,lastChild);
//通过removeChild()移除的节点仍然为文档所有,只不过在文档中已没有了自己的位置。
4.其他方法
cloneNode(),用于创建调用这个方法的节点的一个完全相同的副本。
cloneNode()方法接受一个布尔值参数,表示是否执行深复制。
在参数为true的情况下,执行深复制。
在参数为false的情况下,执行浅复制。
例如
var deepList=myList.cloneNode(true);
alert(deepList.childNode(true));//3(IE<9)的浏览器
var shallowList=myList.cloneNode(false);
alert(shallowList.childNodes.length);//0,浅复制,不包含子节点
Document类型
在浏览器中,document对象是HTMLDocument(继承自Document类型)的一个实例,表示整个HTML页面。
而且,document对象是window对象的一个属性,故可以将其作为全局对象来访问。
文档的子节点
documentElement属性,该属性始终指向HTML页面中的元素。
例
在这个页面经浏览器解析后,其文档中只包含一个子节点。即元素。可以
通过documentElement属性则能快捷,更直接的访问该元素。
var html=document.documentElement;//取得对的引用
alert([html]===document.childNode[0]);//true;
alert([html]===document.firstChild);//true
document对象还有一个body属性,直接指向
另一个子节点就是documentType.
//取得对的引用
var doctype=document.doctype;
文档信息
document对象还有一些属性
1.title包含着
URL属性中包含完整的URL(即地址栏中显示的URL)
domain属性中只包含页面的域名
referrer属性则会保存着链接到当前页面的URL.
例
//取得完整的URL
var url=document.URL;
//取得域名
var domain=document.domain;
//取得来源页面的URL
var referrer=document.referrer;
URL与domain属性是关联的
例如
document.URL等于http://www.wrox.com/WileyCDA/.
document.domain等于www.wrox.com。
如果域名一开始是松散的,那么他就不能在被设置为紧绷的
例
//假设页面来自A2A.wrox.com域
document.domain="wrox.com"//松散的成功
document。domain="A2A.wrox.com"//紧绷的出错
3.查找元素
取得元素的操作
getElementById()和getElementsByTagName().
getElementById()接受一个参数:要取得元素的ID,
若找到相应的元素则返回该元素,否则返回null。
注:ID需与页面中元素的id特性严格匹配,包括大小写
例
getElementByTagName()方法返回一个参数,即要取得元素的标签名
而返回的是包含零或多个元素的NodeList.
例,下面代码会取得页面中的元素,并返回一个HTMLCollection.
var images=document.getElementsByTagName("img");
alert(images.length);//输出图像的数量
alert(images[0].src);//输出第一个图元素的src
alert(images.item(0).src);//输出第一个图元素的src
nameItem()方法,此方法可以通过元素的name特性
取得集合中的项。
例
//通过此方法从images变量中取得这个元素
var myImage=images.namedItem("myImage");
//取得文档中的所有元素
var allElements=document.getElementByTagName("*");
getElementsByName()方法
返回带有给定name特性的所有元素。
例