[js]DOM 篇
- DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作
- 浏览器会根据 DOM 模型,将结构化文档(比如 HTML 和 XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口
一、节点
- DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM 树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子
- 浏览器提供一个原生的节点对象
Node
,上面这七种节点都继承了Node
,因此具有一些共同的属性和方法 -
Document
:整个文档树的顶层节点DocumentType
:doctype
标签(比如<!DOCTYPE html>
)Element
:网页的各种HTML标签(比如<body>
、<a>
等)Attribute
:网页元素的属性(比如class="right"
)Text
:标签之间或标签包含的文本Comment
:注释DocumentFragment
:文档的片段
2、检测节点类型:node.nodeType
- 文档节点(document):9,对应常量
Node.DOCUMENT_NODE
- 元素节点(element):1,对应常量
Node.ELEMENT_NODE
- 属性节点(attr):2,对应常量
Node.ATTRIBUTE_NODE
- 文本节点(text):3,对应常量
Node.TEXT_NODE
- 文档片断节点(DocumentFragment):11,对应常量
Node.DOCUMENT_FRAGMENT_NODE
- 文档类型节点(DocumentType):10,对应常量
Node.DOCUMENT_TYPE_NODE
- 注释节点(Comment):8,对应常量
Node.COMMENT_NODE
3、node.nodeName
属性返回节点的名称
- 文档节点(document):
#document
- 元素节点(element):大写的标签名
- 属性节点(attr):属性的名称
- 文本节点(text):
#text
- 文档片断节点(DocumentFragment):
#document-fragment
- 文档类型节点(DocumentType):文档的类型
- 注释节点(Comment):
#comment
// HTML 代码如下 // <div id="d1">hello world</div> var div = document.getElementById('d1'); div.nodeName // "DIV"
4、node.nodeValue
属性返回一个字符串,表示当前节点本身的文本值,该属性可读写
只有文本节点(text)和注释节点(comment)有文本值,因此这两类节点的nodeValue
可以返回结果,其他类型的节点一律返回null
。同样的,也只有这两类节点可以设置nodeValue
属性的值,其他类型的节点设置无效。
// HTML 代码如下 // <div id="d1">hello world</div> var div = document.getElementById('d1'); div.nodeValue // null div.firstChild.nodeValue // "hello world"
div
是元素节点,nodeValue
属性返回null
。div.firstChild
是文本节点,所以可以返回文本值。
5、Node.textContent属性返回当前节点和它的所有后代节点的文本内容。
二、使用DOM获取元素(Element对象)
1.通过名称类型访问节点
(1)getElementById();
(2)getElementsByTagName();
2.利用父子关系查询节点
(1).ChildNodes //获取全部子节点数组(在Firefox chrome ie9中会包含文本节点)
(2).children //只选择标签节点的子元素
(3).parentNode //父节点
(4).offsetNode //绝对定位的父节点
(5).hasChildnNodes() //判断是否有子节点 返回布尔值
(6).firstChild //第一个子节点 (在Firefox chrome ie9中会包含文本节点)
(7).lastChild //最后一个子节点 (在Firefox chrome ie9中会包含文本节点)
3.利用兄弟关系访问节点
(1).nextSibling
(2).previousSibling
兼容性:在Firefox、chrome等浏览器中会包含文本节点(空节点)
(兼容处理nextSibing)
1 function(node) 2 { 3 var tempLast=node.parentNode.lastChild; 4 if(node==tempLast) 5 return null; 6 var tempObj=node.nextbiSing; 7 while(tempObj.nodeType !=1 && tempObj!=tempLast) 8 tempObj=tempObj.nextSibling; 9 return (tempObj.nodeType==1)?tempObj;null; 10 }
三、获取节点属性
(1)gitAttribute(属性名); //获取属性值
(2)setAttribute(属性名,属性值); //设置属性值
(3)removeAttribute(属性名); //删除属性值
四、创建和添加节点
1、创建节点
(1)createElement("标签名");
(2)createTextNode("文本内容");
(3)createDocumentTragment();
2、添加节点
appendChild(nodename); //添加子节点//默认插入到末尾//动作删除创建位置,插入到新位置
3、删除节点
removeChild(nodename); //找的父元素删除。。。。 x.parentNode.removeChild(x);
4、替换节点
replaceChild(newNode,oldNode); //查找父元素替换。。。 x.parentNode.replaceChild(oNewP,oOldP);
5、在特定节点前插入
insertBefore(newNode,targetNode);
6、在特定节点后插入
1 function insertAfter(newElement,targetElement) 2 { 3 if(oParent.lastChild==targetElement) 4 oParent.appendChild(newElement); 5 else 6 oParent.insertBefore(newElement,targetElement.nextSibling); 7 }