JavaScript(十八)Node 对象

    xiaoxiao2025-07-15  7

    1. 遍历节点

    1.1 获取父节点

    通过 HTML 页面的指定标签查找其父节点(元素节点或文档节点),我们可以通过如下属性实现:

    var 指定标签的父节点=指定标签.parentNode;

    值得注意的是:

    parentNode: 表示获取指定节点的父节点。一个元素节点的父节点可能是一个元素(Element )节点,也可能是一个文档(Document )节点。parentElement: 表示获取当前节点的父元素节点。如果该元素没有父节点,或者父节点不是一个元素节点,则返回 null。

    1.2 获取子节点

    通过 HTML 页面的指定标签查找其子节点,我们可以通过如下属性实现:

    firstChild: 获取指定标签的第一个子节点。 var btn3 = document.getElementById('btn3'); btn3.onclick = function(){ var parentDiv = document.getElementById('parentDiv'); var firstChild = parentDiv.firstChild; firstChild.style.backgroundColor = 'lightgreen'; }

     

    lastChild: 获取指定标签的最后一个子节点。 var btn4 = document.getElementById('btn4'); btn4.onclick = function(){ var parentDiv = document.getElementById('parentDiv'); var lastChild = parentDiv.lastChild; lastChild.style.backgroundColor = 'lightgreen'; } childNodes: 获取指定标签的所有子节点。 var btn5 = document.getElementById('btn5'); btn5.onclick = function(){ var parentDiv = document.getElementById('parentDiv'); var children = parentDiv.childNodes; for (var i=0;i<children.length;i++) { children[i].style.backgroundColor = 'lightgreen'; } }

    1.3 空白节点

    在上述测试获取指定节点的子节点时,我们规定必须要在 IE 8 版本或之前的版本中运行,而不能在其他浏览器中运行。原因在于 DOM 遍历节点时,并不是我们所想象的那样。我们所想象的浏览器遍历 DOM 时,解析的结果应该是如下图所示:

    有些浏览器在遍历 DOM 时,会在元素节点之间添加一个文本节点,不管这个文本节点的内容是否为空(即空白节点)。

     

     

    不会自动添加空白节点的浏览器只有 IE 8 版本以及之前的版本。换句话讲,IE 9 及之后的版本、Chrome、Firefox 和 Safari 等浏览器都会自动添加空白节点。这个问题的解决,可以通过 getElementsByTagName() 方法实现。例如如下代码的改写:

    var btn3 = document.getElementById('btn3'); btn3.onclick = function(){ var parentDiv = document.getElementById('parentDiv'); //var firstChild = parentDiv.firstChild; var firstChild = parentDiv.getElementsByTagName('div')[0]; firstChild.style.backgroundColor = 'lightgreen'; }

    还可以自己封装一个geChildNodes()方法获取真正的子节点:

    function getChildNodes(parentDiv) { // 获取所有子节点 var childNodes=parentDiv.childNodes; // 定义一个数组,用来存放真正的子节点 var childNodeArr=[]; for(var i=0;i<childNodes.length;i++){ if (childNodes[i].nodeType==1){// 真正的元素节点 childNodeArr.push(childNodes[i]); } } return childNodeArr; }

    1.4 获取兄弟节点

    通过 HTML 页面的指定标签查找兄弟节点,我们可以通过如下属性实现:

    previousSibling: 获取指定节点的前一个兄弟节点。 // 获取按钮 var btn6=document.getElementById("btn6"); btn6.onclick=function () { var two=document.getElementById("two"); // 中间存在一个空白节点 var bt5=two.previousSibling.previousSibling; bt5.style.backgroundColor="red"; } nextSibling: 获取指定节点的后一个兄弟节点。

    同样存在空白节点

    2. 插入节点

    向 HTML 页面标签插入新的标签或者其他标签,我们可以通过如下方法实现。

    2.1 appendChild() 方法

    appendChild(): 将一个节点添加到指定父节点的子节点列表末尾。

    parent.appendChild(child) var first = document.getElementById('first'); var li = document.createElement('li'); first.appendChild(li);

    2.2 insertBefore() 方法

    insertBefore(): 在当前节点的某个子节点之前再插入一个子节点。

    parent.insertBefore(newChild,currentChild)

    我们可以通过如下示例来学习插入节点的使用:

    var first = document.getElementById('first'); var two = document.getElementById('two1'); var li = document.createElement('li'); first.insertBefore(li,two);

    2.3 插入已存在标签

    在上述示例中,我们都是向指定节点插入一个创建的新标签。那如果我们是将一个已存在 HTML 页面的标签插入到指定标签中,又会是什么样子的效果呢?

    var btn4=document.getElementById("btn4"); btn4.onclick=function () { var three1=document.getElementById("three1"); var second=document.getElementById("second"); second.appendChild(three1); }

    前:

    后:

    3. 删除节点

    从 HTML 页面中删除指定元素节点(标签),我们可以通过以下方法实现:

    parentNode.removeChild(childNode) var btn = document.getElementById('btn'); btn.onclick = function(){ var parent = document.getElementById('container'); var two = document.getElementById('two'); parent.removeChild(two); }

    将 HTML 页面中指定元素节点(标签)被替换,我们可以通过以下方法实现:

    parentNode.replaceChild(newChild,oldChild)

    5. 复制节点

    将 HTML 页面中指定元素节点(标签)进行复制,我们可以通过以下方法实现:

    node.cloneNode(boolean)

    需要说明的是: cloneNode() 方法的参数表示是否采用深度克隆。如果为true,则该节点的所有后代节点也都会被克隆;如果为false,则只克隆该节点本身。

    我们可以通过如下示例来学习插入节点的使用:

    var btn = document.getElementById('btn'); btn.onclick = function(){ var parent = document.getElementById('container'); var two = document.getElementById('two'); var newLi = two.cloneNode(true); parent.appendChild(newLi); }

    6 动态左右移动效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>动态左右移动效果</title> <link rel="stylesheet" href="css/style.css" /> <style> body { padding: 100px; } select { width: 100%; } </style> </head> <body> <div class="container"> <div class="col-md-4"> <select id="first" size="10" multiple> <option>Argentina</option> <option>Brazil</option> <option>Canada</option> <option>Chile</option> <option>China</option> <option>Cuba</option> <option>Denmark</option> <option>Egypt</option> <option>France</option> <option>Greece</option> <option>Spain</option> </select> </div> <div class="col-md-4"> <p><button id="add" class="btn btn-primary btn-block">></button></p> <p><button id="add_all" class="btn btn-primary btn-block">>></button></p> <p><button id="remove" class="btn btn-primary btn-block"><</button></p> <p><button id="remove_all" class="btn btn-primary btn-block"><<</button></p> </div> <div class="col-md-4"> <select id="second" size="10" multiple> </select> </div> </div> </body> <script> // 向右移动 // 获取按钮 var add=document.getElementById("add"); // 给按钮派发点击事件 add.onclick=function () { // 获取下拉框节点 first var first=document.getElementById("first"); var second=document.getElementById("second"); //获取first所有节点 var selectedList=first.getElementsByTagName("option"); // for (var i=0;i<selectedList.length;i++){ if (selectedList[i].selected){ second.appendChild(selectedList[i]); i--; } } } // 向右全部移动 // 获取按钮 var add_all=document.getElementById("add_all"); // 派发点击事件 add_all.onclick=function () { // 获取左边的所有节点 // 获取父节点first var first=document.getElementById("first"); var second=document.getElementById("second"); var optionList=first.getElementsByTagName("option"); for (var i=0;i<optionList.length;i++) { second.appendChild(optionList[i]); i--; } } </script> </html>

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)