DOM(一):节点层次-Node类型
Node类型
DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现,每个节点都有一个nodeType属性,用于表明节点的类型。节点类型由在Node
类型中定义的下列12个数值常量来表示,任何节点类型必居其一:
元素节点 Node.ELEMENT_NODE(1) 属性节点 Node.ATTRIBUTE_NODE(2) 文本节点 Node.TEXT_NODE(3) CDATA节点 Node.CDATA_SECTION_NODE(4) 实体引用名称节点 Node.ENTRY_REFERENCE_NODE(5) 实体名称节点 Node.ENTITY_NODE(6) 处理指令节点 Node.PROCESSING_INSTRUCTION_NODE(7) 注释节点 Node.COMMENT_NODE(8) 文档节点 Node.DOCUMENT_NODE(9) 文档类型节点 Node.DOCUMENT_TYPE_NODE(10) 文档片段节点 Node.DOCUMENT_FRAGMENT_NODE(11) DTD声明节点 Node.NOTATION_NODE(12)
为了确保跨浏览器兼容,最好还是将nodeType属性与数字值进行比较
if(someNode.nodeType == 1){ console.log('node is an element.'); value = someNode.nodeName; }
nodeName中保存的始终都是元素的标签名,而nodeValue的值则始终为null。在使用这两个值以前,最好是像上面这样先检测一下节点的类型
NodeList
每个节点都有一个childNodes属性,其中保存着一个NodeList对象,NodeList对象是一种类数组对象,用于保存一组有序的点,可以通过位置来访问
这些节点。NodeList对象是自动变化的
<!DOCTYPE html> <html> <head> <title>sample page</title> </head> <body> <p>Hello World!</p> </body> </html>
var firstChild = $(html).childNodes[0]; var secondChild = $(html).childNodes.item(1); var count = $(html).childNodes.length;
无论使用方括号还是使用item()方法都没有问题,length属性表示都是访问nodelist都那一刻,其中包涵的节点数量
将NodeList对象转化为数组
function converToArray (nodes) { var arrary = null; try { array = Array.prototype.slice.call(nodes,0); //在ie8及之前版本中无效,需要手动创建数组 }catch (ex) { array = new Array(); for (var i=0,len=nodes.length ; i<len ; i++) { array.push(nodes[i]); } } return array; }
检测是第一个节点还是最后一个
每个节点都有一个parentNode属性,该属性指向文档树中的父节点。
包含在childNodes列表中的每个节点相互之间都是同胞节点,previousSibling(上一个同胞节点),nextSibling(下一个同胞节点)
if(someNode.nextSibling === null){ console.log('last node'); //最后一个节点 }else if(someNode.previousSibling === null){ console.log('first node'); //第一个节点 }
如果列表只有一个节点,那么该节点的nextSibing和previousSibling都为null.