操作节点
1. 查找获取元素节点
-
document 的接口方法
document.getElementById() 通过元素Id,唯一性 document.getElementsByTagName() 通过标签名 获取一组元素 document.getElementsByName() 通过name属性 获取一组元素 //下面的不兼容IE8 及以下的浏览器 document.getElementsByClassName() 通过类名 获取一组元素
注意后面三个是 Elements
//下面的不兼容IE6\7
通过CSS 选择器(id、类名、类型、属性、属性值等等)获取一个元素
document.querySelector()
通过CSS选择器 获取一组元素
document.querySelectorAll()
-
Node 的接口方法
Node.parentNode 元素的父节点 Node.parentElement 元素的父Element元素节点 Node.previousSibling 元素的前一个节点 Node.previousElementSibling 元素的前一个Element元素节点 Node.nextSibling 元素的后一个节点 Node.nextElementSibling 元素的前一个Element元素节点注意,Node 节点包含“
Element元素节点+Text文本节点+Comment注释节点” 所以想要获取平常的标签,要用 Element 相关的方法 -
ParentNode 的接口方法
ParentNode.childNodes 父元素的所有子节点 ParentNode.children 父元素的所有Element元素节点 ParentNode.firstChild 父元素的第一个节点 ParentNode.firstElementChild 父元素的第一个Element元素子节点 ParentNode.lastChild 父元素的最后一个节点 ParentNode.lastElementChild 父元素的最后一个Element元素子节点 ParentNode.hasChildNodes 当前父元素是否有子节点 ParentNode.childElementCount 当前父元素所有Element子节点的数目注意,Node 节点包含“
Element元素节点+Text文本节点+Comment注释节点” 所以想要获取平常的标签,要用 Element 相关的方法 -
补充 Node 的属性
Node.nodeType 获取Node节点的类型,总共有12种类型,从1-12- 注意
- 1 为元素节点
- 2 为属性节点
- 3 为文本节点
- 8 为注释节点
- 9 为文档节点
Node.nodeName; //获取Node节点名,后面需要.tolowerCase()配合变小写 Node.nodeValue; //获取Node节点值- 注意
- 元素节点没有值,为 null
- 属性节点的值是属性值
- 文本节点的值是文本
对于 <div id="john" name="myname">John</div>元素节点例子: var d = document.getElementById("john"); alert(d.nodeType) //返回1 alert(d.nodeName) //返回DIV alert(d.nodeValue) //返回null 属性节点例子: document.getElementById("john").getAttributeNode("name") alert(d.nodeType) //返回2 alert(d.nodeName) //返回name alert(d.nodeValue) //返回myname 文本节点例子: var d = document.getElementById("john").firstChild alert(d.nodeType) //返回3 alert(d.nodeName) //返回#text alert(d.nodeValue) //返回John - 注意
2. 创建新节点
document.createElement(tagName) 生成Element元素节点,IE8以下不支持
document.createAttribute(name) 生成Attribute属性节点
document.createTextNode(text) 生成Text文本节点
document.createComment(comment) 生成Comment注释节点
document.createDocumentFragment() 生成一个DocumentFragment对象,可临时保存可能要添加到文档中的DOM节点
3. 添加删除元素节点
-
ParentNode 的接口方法
//尾部插入子元素节点,只能插一个 //参数只能是Node对象,返回值是插入的Node对象 ParentNode.appendChild(element); //父元素删除子元素节点 ParentNode.removeChild(element); //父元素替换旧的成新的子元素节点 ParentNode.replaceChild(new_element, old_element); //在父元素下的referenceNode之前插入newNode //referenceNode参数必须要传入,如果是null代表插到末尾 parentNode.insertBefore(newNode, referenceNode);- 注意
- 没有 insertAfter
- 不过可以用 insertBefore 和 Node.nextSibling 来模拟
- 注意
-
ParentNode 的实验性接口方法(IE 兼容性差,尽量不要用,否则要 Polyfill)
尾部插入子元素节点, 可同时插几个; 参数可以是Node和DOMString对象, 没有返回值; ParentNode.append(element1, element2); 同理有头部插入子元素节点, 也可同时插几个; ParentNode.prepend(element1, element2); -
ChildNode 的实验性接口方法(IE 兼容性差,尽量不要用)
childNode.remove() 子元素节点自己调用删除自己 childNode.replaceWith(new_element) 子元素节点自己用新的替换掉自己 ChildNode.before(element1,element2) 子元素节点在自己前面插入兄弟节点 ChildNode.after(element3,element4) 子元素节点在自己后面插入兄弟节点
4. 判断元素节点
//判断父元素是否存在子节点,返回布尔值
ParentNode.hasChildNodes();
//其他判断方法:
ParentNode.firstChild !== null;
ParentNode.childNodes.length > 0;
//判断父元素是否存在指定的node后代节点,返回布尔值
ParentNode.contains(node);
//判断Node节点是否等于指定的node节点,类型/属性/子节点都要相同才行
Node.isEqualNode(node);
//把Node克隆给cloneNode
//参数默认false(只克隆节点), 或者true(克隆节点及其属性,以及后代)
cloneNode = Node.cloneNode(参数);
5. 修改文本节点
TextNode.appendData(data);
将data加到文本节点后面;
TextNode.deleteData(start, length);
将从start处删除length个字符;
TextNode.insertData(start, data);
在start处插入字符, start的开始值是0;
TextNode.replaceData(start, length, data);
在start处用data替换length个字符;
TextNode.splitData(offset);
在offset处分割文本节点;
TextNode.substringData(start, length);
从start处提取length个字符;
6. 插入 HTML 字符串作为节点
-
语法:
Element.insertAdjacentHTML(位置, htmlString); -
例子:
# 在该元素前插入 Element.insertAdjacentHTML('beforeBegin', htmlString); # 在该元素第一个子元素前插入 Element.insertAdjacentHTML('afterBegin', htmlString); # 在该元素最后一个子元素后面插入 Element.insertAdjacentHTML('beforeEnd', htmlString); # 在该元素后插入 Element.insertAdjacentHTML('afterEnd', htmlString);
7.获取/修改元素节点的属性值,判断+移除
//获取属性
Element.属性名
或者Element.getAttribute("属性名")
//如果要获取class,则要用className作为属性名
//如果要获取tag,则要用tagName作为属性名
//如果要获取data-*,则要用dataset作为属性名
//如果要获取所有class,要用classList,并且有如下操作:
Element.classList.remove("类名","类名2"...) //删掉
Element.classList.add("类名","类名2"...) //添加
Element.classList.toggle("类名") //有就删掉,没就添加
Element.classList.contains("类名") //判断是否包含
//获取元素自身宽高属性值及相对于浏览器窗口的位置值
var clientRect = Element.getBoundingClientRect();
然后 clientRect.width或.height 或 .left或.top(以左上角为基准) 获取
//修改style属性,记得转换成驼峰式命名
//注意只能拿到内联样式,要拿所有,需要window.getComputedStyle方法,能得到最终展示出来的样式数据,但IE8不支持
Element.style.驼峰式css属性 = 新值
//修改其他属性
Element.属性名 = 新值
或者Element.setAttribute("属性名", "新值")
//判断是否存在属性,返回布尔值
Element.hasAttribute("属性名")
//移除属性
Element.removeAttribute("属性名")
8. 元素节点的事件相关
//添加事件的回调函数
Element.addEventListener(事件名, 回调函数, 捕获true / 冒泡false);
//移除事件的回调函数
Element.removeEventListener(事件名, 回调函数);
//对于IE8,添加和移除要换成特殊写法
Element.attachEvent(事件名, 回调函数);
Element.detachEvent(事件名, 回调函数);
//???回调函数内获取正在触发的事件,后面的event是为了兼容Firefox???
var event = window.event || event;
//回调函数内获取事件的目标节点,后面的srcElement是为了兼容老版本IE
var target = event.target || event.srcElement;
//自定义事件
var my_event = document.createEvent("Event");
// 定义事件名为'build'.
my_event.initEvent("build", true, true);
// 监听事件,设置为冒泡
Element.addEventListener("build", function (e) {}, false);
//触发事件
Element.dispatchEvent(my_event);