js DOM操作
DOM节点操作:增删改查
问:
document.write()创建节点的不足
页面加载完成之后,使用document.write()这种方式会将页面重写,所以会覆盖掉页面中原有的元素。
create创建节点
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>create方法</title> <script src="domReady.js"></script> <script> myReady(function(){ var comment = document.createComment("A comment"); var fragment = document.createDocumentFragment(); var ul = document.getElementById("myList"); var li = null; for (var i = 0; i < 3; i++){ li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i+1))); fragment.appendChild(li); } ul.appendChild(fragment); document.body.insertBefore(comment, document.body.firstChild);//很少动态创建注释节点 }); </script> </head> <body> <ul id="myList"></ul> </body> </html>
总结:
createElement 创建元素节点 createDocumentFragment 创建一个文档片段
使用createDocumentFragment主要是因为避免因createElement多次添加到document.body引起的效率问题
最主要的区别就是createElement创建的元素可以重复操作 但是createDocumentFragment创建的元素是一次性的,添加之后再就不能操作了
其次还有一个区别是fragment使用innerHTML不能达到修改文本的效果
createTextNode 创建文本节点 createComment 创建注释 一般不会动态添加
在ie6 7中创建本不兼容的h5标签
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>html5shiv</title> <!--为了让ie浏览器兼容h5新标签--> <style> /*html5*/ article { font-size: 40px; color: red; } </style> <script> (function() { if (! /*检测是不是ie ie会将整个判断语句看做 !!0*/ /*@cc_on!@*/ 0) return; var e = "abbr, article, aside, audio, canvas, datalist, details, dialog, eventsource, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, time, video".split(", "); var i = e.length; while (i--){ document.createElement(e[i]); } })(); </script> </head> <body> <article> You are my sunshine. </article> </body> </html>
高效创建节点的方式
innerHtml
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>innerHTML</title> <script src="domReady.js"></script> <script> myReady(function(){ var content = document.getElementById("content"); var str = "<p>This is a <strong>paragraph</strong> with a list following it.</p>" + "<ul>" + "<li>Item 1</li>" + "<li>Item 2</li>" + "<li>Item 3</li>" + "</ul>"; content.innerHTML = str; alert(content.innerHTML); }); </script> </head> <body> <div id="content"></div> </body> </html>
innerHtml使用限制 ie6 -8 会忽略空格 有可能执行script标签 例如style标签前面要添加有作用域的标签 了解一下
还有一个outerHTML 返回调用它的函数及所有子节点的html标签
*innerHTML 和 outerHTML的区别
一、区别: 1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签。 2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身。 二、例子1:
<div id="test"> <span style="color:red">test1</span> test2 </div>
1)innerHTML的值是“<span style="color:red">test1</span> test2 ” 2)outerHTML的值是<div id="test"><span style="color:red">test1</span> test2</div> 三. 例子2:
<body> <div>aa</div> </body>
通过document.body.innerHTML获取到的内容是:<div>aa</div> 通过document.body.outerHTML获取到的内容是:<body><div>aa</div></body>
innerText会过滤掉标签 只适用于ie 推荐使用innerHTML
兼容所有浏览器的innerText的方法
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>innerText</title> <script src="domReady.js"></script> <script> myReady(function(){ var content = document.getElementById("content"); function getInnerText(element){//兼容 return typeof (element.textContent == "string") ? element.textContent : element.innerText;//火狐用textContent 其他用后者 } function setInnerText(element, text){ if (typeof element.textContent == "string"){ element.textContent = text; } else { element.innerText = text; } } setInnerText(content, "Hello world!"); console.log(getInnerText(content)); }); </script> </head> <body> <div id="content"> <p>This is a <strong>paragraph</strong> with a list following it.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div> </body> </html>
outText和innerText基本没什么区别 不常用不建议用
遍历节点
查找节点
打印<html>
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>dom Tree walker</title> <script src="domReady.js"></script> <script> myReady(function(){ var oHtml = document.documentElement; //<html> var p = document.getElementById("paragraph"); var txt = p.childNodes[0]; //var oHead = oHtml.firstChild; //var oHead = oHtml.childNodes[0]; //head var oHead = oHtml.childNodes.item(0);//head //var oBody = oHtml.childNodes.item(1); var oBody = oHtml.childNodes[1];//body 但是只有在ie浏览器是正常打印 其他的不能正常打印因为会将空白节点视为了节点 //console.log(oHead.parentNode == oHtml); //console.log(oBody.parentNode == oHtml); //console.log(oBody.previousSibling == oHead); //console.log(oHead.nextSibling == oBody); //console.log(oBody); //console.log(oHead); //console.log(oHtml.tagName); //console.log(p.ownerDocument == document); console.log(p.hasChildNodes()); console.log(txt.hasChildNodes()); }); </script> <!--解决会打印空白节点的问题可以如下 但是不推荐--> </head><body> <p id="paragraph">文本叶子节点</p> </body> </html>
问
打印结果分别是 false true false
为什么第一个是false呢?
因为list1的firstChild是空白节点 所以空白没有子节点 返回false
节点遍历案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>DOM Travel</title> <script src="domReady.js"></script> <script> myReady(function(){ var s = ""; function travel(space, node) { if (node.tagName) { s += space + node.tagName + "<br/>"; } var len = node.childNodes.length; for (var i = 0; i < len; i++) { travel(space + "|-", node.childNodes[i]); } } travel("", document); document.write(s); }); </script> </head> <body> <form> <input type="button" id="button1" name="button1" value="Click Me!" /> </form> </body> </html>
打印结果为
|-HTML
|-|-HEAD
|-|-|-META
|-|-|-META
|-|-|-TITLE
|-|-|-SCRIPT
|-|-|-SCRIPT
|-|-BODY
|-|-|-FORM
|-|-|-|-INPUT
解决空白节点
方法一
tips:元素节点的nodetype值为1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>查找子节点(二)</title> <script src="domReady.js"></script> <script> myReady(function(){ var box = document.getElementById("box"); for(var i = 0, len = box.childNodes.length; i < len; i++) { if (box.childNodes[i].nodeType == 1) { console.log(box.childNodes[i]); } } }); </script> </head> <body> <ul id="box"> <li>节点一</li> <li>节点二</li> <li>节点三</li> </ul> </body> </html>
方法二
这是一套专门查找元素节点的api 忽略了文本节点(空白节点)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>查找子节点(三)</title> <script src="domReady.js"></script> <script> myReady(function(){ var box = document.getElementById("box"); for(var i = 0, len = box.childElementCount; i < len; i++) { console.log(box.children[i]); } }); </script> </head> <body> <ul id="box"> <li>节点一</li> <li>节点二</li> <li>节点三</li> </ul> </body> </html>注意:ie8以下不支持这套api
类数组对象nodelist
例子
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>NodeList对象的特点</title> <script src="domReady.js"></script> <script> myReady(function(){ var box = document.getElementById("box"); var nodes = box.childNodes; //console.log(nodes); //console.log(nodes[1]); //console.log(nodes.item(1)); //nodes.push("<li>节点四</li>");添加不了 因为不具有数组的方法 所以不是真正的数组 //如果想让nodelist像上面那样添加 function makeArray(nodeList){ var arr = null; try { // 这个方法也可以将类数组转化为数组 return Array.prototype.slice.call(nodeList);//ie浏览器会出现问题 所以这个方法不行就用下面的 }catch (e){ arr = new Array(); //把nodelist的值装到这个数组里 for(var i = 0, len = nodeList.length; i < len; i++){ arr.push(nodeList[i]); } } return arr; } var newNodeList = makeArray(nodes); newNodeList.push("<li>节点四</li>"); console.log(newNodeList);//实际显示不出来这个节点四 }); </script> </head> <body> <ul id="box"> <li>节点一</li> <li>节点二</li> <li>节点三</li> </ul> </body> </html>
类数组对象HTML collection
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>类数组对象HTMLCollection</title> <script src="domReady.js"></script> <script> myReady(function(){ var scripts = document.scripts;//返回script var links = document.links;//返回a标签 var cells = document.getElementById("tr").cells; var imgs = document.images;//返回img var forms = document.forms;//表单 var options = document.getElementById("select").options; var ps = document.getElementsByTagName("p"); /*console.log(scripts); console.log(links); console.log(cells); console.log(imgs); console.log(forms); console.log(options); console.log(ps);*/ console.log(cells.namedItem("td"));//返回表格里第一个id或者name为td的元素 }); </script> </head> <body> <ul id="box"> <li>节点一</li> <li>节点二</li> <li>节点三</li> </ul> <table border="1"> <tr id="tr"> <td>第一行</td> <td name="td">第二行</td> <td name="td">第三行</td> </tr> </table> <img src="duer.jpg" alt="img1" /> <img src="ipone6s+.png" alt="img2" /> <form action=""> <input type="text" value="用户名"> </form> <form action=""> <input type="text" value="密码"> </form> <a href="#">忘记密码</a> <a href="#">更多内容</a> <select id="select"> <option value="0">北京</option> <option value="1">天津</option> <option value="2">河北</option> </select> <p>DOM探索之基础详解篇</p> <p>DOM探索之节点操作篇</p> </body> </html>
类数组对象namedNodeMap
ele.attribute
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>类数组对象NamedNodeMap</title> <script src="domReady.js"></script> <script> myReady(function(){ var box = document.getElementById("box"); var attrs = box.attributes; //console.log(attrs); console.log(attrs.length); console.log(attrs[0]); console.log(attrs.item(1)); }); </script> </head> <body> <ul id="box" data-url="index.html" node-action="submit"> <li>节点一</li> <li>节点二</li> <li>节点三</li> </ul> </body> </html>
类数组对象的动态性
看一个例子
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>类数组对象的动态性(一)</title> <script src="domReady.js"></script> <script> myReady(function(){ var divs = document.getElementsByTagName("div"); // var length = divs.length; var i = 0; while(i < length){ document.body.appendChild(document.createElement("div")); i++; } }); </script> </head> <body> <div></div> <div></div> <div></div> </body> </html>这里的while循环理应循环三次就结束 但实际上会让浏览器陷入死循环 原因是html collection的动态性造成的
节点查找
ById
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getElementById()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myDiv = document.getElementById("myDiv"); console.log(myDiv.tagName); var myUl = myDiv.getElementById("myUl");//会报错 不能使用非document对象使用byid方法 console.log(myUl); }); </script> </head> <body> <input type="text" name="myDiv" value="请输入内容" /> <div id="myDiv"> You are my sunshine. <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> </html>
byid的方法有bug
bug1 ie下的bug
<script> myReady(function(){ var bn = document.getElementById("button"); bn.onclick = function() { var target = document.getElementById("target"); console.log(target.innerHTML); } }); </script> </head> <body> <a name="target" href="http://www.cnblogs.com/rubylouvre/">这是错误的元素</a> <p id="target">这是正确的元素</p> <button id="button" type="button">开始测试</button> </body>这里查找到的是name=“target”的元素
bug2:有两个id一样的元素也只会返回第一个
解决bug
byname<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>IE getElementById bug</title> <script src="domReady.js"></script> <script> myReady(function(){ var getElementById = function(id) { var el = document.getElementById(id); if(!+"v1") {//也可以用useragent方法判断是不是ie浏览器 ie是true if(el && el.attributes["id"].value === id) {//不能用el.id === id 来判断 原因见下. //判断条件为el存在 并且id属性值为传参的 return el; } else { var els = document.all[id], n = els.length; for (var i = 0; i < n; i++) { if (els[i].attributes["id"].value === id) { return els[i];//过滤掉name 只留下Id } } } } return el; }; //console.log(getElementById("target").tagName); /*var formElement1 = getElementById("myForm1"); var formElement2 = getElementById("myForm2"); alert(formElement1.getAttribute("id")); alert(formElement2.getAttribute("id")); alert(formElement1.id); alert(formElement2.id);*///这个返回值有问题 所以 不能使用el.id === id 来判断 var bn = getElementById("button"); bn.onclick = function(){ var target = getElementById("target"); var formElement2 = getElementById("myForm2"); alert(target.innerHTML); alert(formElement2.tagName); }; }); </script> </head> <body> <form id="myForm1"> <input id="user_id" name="user_id" value="text" /> </form> <form id="myForm2"> <input id="id" name="id" value="text" /> </form> <a name="target" href="http://www.cnblogs.com/rubylouvre/">这是错误的元素</a> <p id="target">这是正确的元素</p> <button id="button" type="button">开始测试</button> </body> </html>***注意document.all[]和docuement.attributes[]都是括号
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getElementsByName()</title> <script src="domReady.js"></script> <script> myReady(function(){ //var myUl = document.getElementsByName("myUl"); var myDiv = document.getElementById("myDiv"); //var myUl = myDiv.getElementsByName("myUl");//报错 var citys = document.getElementsByName("city"); console.log(myUl); console.log(myDiv); console.log(citys.length); }); </script> </head> <body> 北京<input type="checkbox" id="beijing" name="city" value="北京" /> 天津<input type="checkbox" name="city" value="天津" /> 上海<input type="checkbox" name="city" value="上海" /> <div id="myDiv"> You are my sunshine. <ul id="myUl" name="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> </html>
注意在ie6 7有bug
bytagname
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getElementsByTagName()</title> <script src="domReady.js"></script> <script> myReady(function(){ var lis1 = document.getElementsByTagName("li"); var lis2 = document.getElementsByTagName("Li"); var inputs = document.getElementsByTagName("input"); var comment = document.getElementsByTagName("!");//在ie6-8下面doctype会被当成注释 var all = document.getElementsByTagName("*");//获得所有元素 /*console.log(lis1.length); console.log(lis2.length); console.log(inputs[0].value); console.log(comment[0].nodeValue); console.log(comment[1].nodeValue);*/ for(var i = 0, len = all.length; i < len; i++) { console.log(all[i].tagName); } }); </script> </head> <body> <!--页面元素--> <input type="text" name="myDiv" value="请输入内容" /> <div id="myDiv"> You are my sunshine. <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> </html>
上述三个api基本上都兼容
下面的兼容不是很好
byclassname
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getElementsByClassName()</title> <script src="domReady.js"></script> <script> myReady(function(){ var ul = document.getElementById("myUl"); var lis1 = ul.getElementsByClassName("light"); var lis2 = ul.getElementsByClassName("light dark"); console.log(lis1); console.log(lis2); }); </script> </head> <body> <ul id="myUl"> <li class="light">1</li> <li class="dark light">2</li> <li class="light">3</li> </ul> </body> </html>
解决byclassname的兼容问题 ie8以下
html部分
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>getElementsByClassName() 兼容浏览器方案</title> <script src="domReady.js"></script> <script src="getElementsByClassName.js"></script> <script> myReady(function(){ var myUl2 = document.getElementById("myUl2"); var r = getElementsByClassName({ searchClass: "light dark", node: myUl2, tag : "div" }); console.log(r[0].innerHTML); }); </script> </head> <body> <ul id="myUl"> <li class="light">1</li> <li class="light dark">2</li> <li class="light">3</li> </ul> <ul id="myUl2"> <li class="light">1</li> <li class="light dark">second</li> <div class="light dark">5555</div> <li class="light">3</li> </ul> </body> </html>
js部分
var getElementsByClassName = function(opts) { var searchClass = opts.searchClass; //存储要查找的类名 var node = opts.node || document;//存储要查找的范围 var tag = opts.tag || "*";//存储一定范围内的要查找的标签 var result = []; //判断浏览器是否支持byclassname的方法 if (document.getElementsByClassName) { var nodes = node.getElementsByClassName(searchClass); if (tag !== "*") { for (var i = 0; node = nodes[i++];) { //nodes是className的集合,它是有数量的,比如有5个,那么在循环中,初始值是0,他会往后曲循环,0、1、2、3、4,当它走到5时,nodes中没有第六项,所以下面就不会再执行了,因为if里面也是有判断的。 if (node.tagName === tag.toUpperCase()) {//tagname都是大写 result.push(node); } } } else { result = nodes; } return result; } else {//ie8以下 var els = node.getElementsByTagName(tag); var elsLen = els.length; var i, j; var pattern = new RegExp("(^|\s)" + searchClass + "(\s|$)");//通过正则表达式 只找到一个的情况是一个class 找到多个中间会有空格 则判断开始和结尾有空格 ^是正则的开始 $是正则的结尾for (i = 0, j = 0; i < elsLen; i++) { if (pattern.test(els[i].className)) {//检测匹配正则表达式的classname result[j] = els[i];//放入result中 j++; } } return result; }}
queryselector 和queryselectorall
既可以使用document调用 也可以使用别的节点调用 前者只返回一个 !!!!
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>querySelector()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myDiv = document.getElementById("myDiv"); //var ul = myDiv.querySelector("#myUl"); var ul = document.querySelector("#myUl"); var li = myDiv.querySelector("li:last-child"); var els = document.querySelector("input, li"); var span = document.querySelector("span"); var input = document.querySelector(".foo\:bar");//:和/都需要转义 //console.log(ul); //console.log(li); //console.log(els); //console.log(span); console.log(input); }); </script> </head> <body> <input type="text" class="foo:bar" value="请输入内容" /> <div id="myDiv"> You are my sunshine. <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> </html>
selectorall
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>querySelectorAll()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myDiv = document.getElementById("myDiv"); var ul = myDiv.querySelectorAll("ul"); var li = myDiv.querySelectorAll("li"); var span = myDiv.querySelectorAll("span"); //console.log(ul); //console.log(li); console.log(span); }); </script> </head> <body> <input type="text" name="myDiv" value="请输入内容" /> <div id="myDiv"> You are my sunshine. <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> </html>
* querySelector() 方法仅仅返回匹配指定选择器的第一个元素。如果你需要返回所有的元素,请使用querySelectorAll() 方法替代。
操作节点
appendchild增加节点
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>appendChild()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); var txt = document.createTextNode("4"); var li = document.createElement("li"); var firstLi = myUl.firstElementChild; li.appendChild(txt); myUl.appendChild(li); var returnedNode = myUl.appendChild(firstLi); console.log(returnedNode); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
insertbefore
appendchild是放在最后面 这个是放在前面
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>insertBefore()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); var txt = document.createTextNode("4"); var liNew = document.createElement("li"); liNew.appendChild(txt); // var li2 = myUl.children.item(1); // var returnNode = myUl.insertBefore(liNew, li2); // console.log(returnNode.innerHTML); // myUl.insertBefore(liNew, null);实现和appendchild一样的添加到末尾 // 事实上这个方法可以在任何地方添加节点 // myUl.insertBefore(liNew, myUl.firstElementChild); myUl.insertBefore(liNew, myUl.lastElementChild); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
replaceChild
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>replaceChild()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); var txt = document.createTextNode("4"); var liNew = document.createElement("li"); liNew.appendChild(txt); var li2 = myUl.children.item(1); var returnNode = myUl.replaceChild(liNew, li2);//返回的就是被替换掉的节点 console.log(returnNode); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
cloneNode
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>cloneNode()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); var newNode = myUl.cloneNode(true);//加了true之后是深度复制 连子节点一起复制了 console.log(newNode); document.body.appendChild(newNode); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
normalize 合并
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>normalize()</title> <script src="domReady.js"></script> <script> myReady(function(){ var div = document.createElement("div"); var textNode = document.createTextNode("DOM探索"); div.appendChild(textNode); var textNode2 = document.createTextNode("之节点操作篇"); div.appendChild(textNode2); document.body.appendChild(div); console.log(div.childNodes.length); div.normalize(); console.log(div.childNodes.length); console.log(div.firstChild.nodeValue);//获得合并之后的内容 }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
spliteText 将一个文本节点分割为两个文本节点
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>splitText()</title> <script src="domReady.js"></script> <script> myReady(function(){ var div = document.createElement("div"); var textNode = document.createTextNode("DOM探索之节点操作篇"); div.appendChild(textNode); document.body.appendChild(div); var newNode = div.firstChild.splitText(5);//从第五个字符拆分 console.log(div.firstChild.nodeValue); console.log(newNode.nodeValue); console.log(div.childNodes.length); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
删除节点
removeChild
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>removeChild()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); console.log(myUl.childNodes.length); var secondChild = myUl.removeChild(myUl.childNodes[1]);//必须有参数 console.log(secondChild); console.log(myUl.childNodes.length); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
removeNode
ie私有实现
将目标节点从文档中删除返回目标节点
参数为布尔值 默认false
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>removeNode()</title> <script src="domReady.js"></script> <script> myReady(function(){ var myUl = document.getElementById("myUl"); var removedNode = myUl.removeNode(true); console.log(removedNode.outerHTML); }); </script> </head> <body> <ul id="myUl"> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
removechild和innerHTML的区别
在ie6-8下removechild移除的节点还可以使用(折断树枝但树枝还可以使用) 而innerHTML相当于直接销毁了(拔掉树枝并烧掉)
在chrome下两者都是折断树枝依旧可以使用的
总结
- 上一篇: js 基本类型或引用类型的判断
- 下一篇: 常见DOM操作(JS)