当前位置:编程学习 > JS >>

DOM节点操作与节点之间关系浅析

操作节点

// 向节点的子节点列表的末尾添加新的子节点
someNode.appendChild(newchild)

例子
下面的函数将在文档末尾插入一个新段:

 代码如下 复制代码

function appendMessage (message) {
  var pElement = document.createElement("p");
  var messageNode = document.createTextNode(message);
  pElement.appendChild(messageNode);
  document.body.appendChild(pElement);
}

// 在已有的子节点前插入一个新的子节点

someNode.insertBefore(newchild, refchild)

下面的下面片段可创建一个新的 <book> 节点,并在文档中的最后一个 <book> 元素前插入此节点:

 代码如下 复制代码

//check if the last childnode is an element node
function get_lastchild(n)
{
var x=n.lastChild;
while (x.nodeType!=1)
{
x=x.previousSibling;
}
return x;
}

xmlDoc=loadXMLDoc("books.xml");
var newNode=xmlDoc.createElement("book");
var newTitle=xmlDoc.createElement("title");
var newText=xmlDoc.createTextNode("A Notebook");
newTitle.appendChild(newText);
newNode.appendChild(newTitle);

xmlDoc.documentElement.insertBefore(newNode,get_lastchild(x));


 

// 将某个子节点替换为另一个
someNode.replaceChild(new_node, old_node)

下面的代码片段可替换首个 <book< 元素中的 <title> 元素:

 代码如下 复制代码

//check if first child node is an element node
function get_firstchild(n)
{
var x=n.firstChild;
while (x.nodeType!=1)
  {
  x=x.nextSibling;
  }
return x;
}

xmlDoc=loadXMLDoc("books.xml");

//create a title element and a text node
var newNode=xmlDoc.createElement("title");
var newText=xmlDoc.createTextNode("Giada's Family Dinners");
//add the text node to the title node,
newNode.appendChild(newText);

//replace the first child node with the new node
var x=xmlDoc.getElementsByTagName("book")[0];
x.replaceChild(newNode,get_firstchild(x));

//output all titles
var y=xmlDoc.getElementsByTagName("title");
for (i=0;i<y.length;i++)
  {
  document.write(y[i].childNodes[0].nodeValue);
  document.write("<br />");
  }
输出:
Giada's Family Dinners
Harry Potter
XQuery Kick Start
Learning XML

// 从子节点列表中删除某个节点
someNode.removeChild(node)

removeChild函数则可以删除文档中的指定节点。我们仍然使用一个例子来说明该函数的使用方法。

HTML代码

 代码如下 复制代码
<div id="test"> <p>我是将要被删除的节点</p></div>实例JavaScript代码
<script type="text/javascript">
function remove(){ 
var test = document.getElementById("test"); 
var children = test.childNodes; for(i=0;i<children.length;i++)
{  
test.removeChild(children[i]); }
}
</script>

删除节点示例

我是将要被删除的节点

remove() ,点击这个按钮就会将上面div的子结点全部删除。
从上面的JS代码可以看到,使用removeChild的格式为:

父节点.removeChild(子结点)

removeChild的返回值

removeChild删除节点后会返回被删除节点的引用,这样当我们以后再想重新将它添加到文档中,或者是对它进行其它操作的时候就可以使用这个引用了。例如下面的代码段:

var removed = xxx.removeChild(xxxx);

则removed就是被删除的节点,可以在后面的代码中使用。

创建节点、appendChild,insertBefore,DOM节点查找、增加节点

 代码如下 复制代码

<head>
<title>新建网页</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" />
<script type="text/javascript">
    function showpic(pic){
        var gallerynode = document.getElementById('gallery');
        source = pic.getAttribute('href');
        gallerynode.setAttribute('src',source);
        var text = pic.getAttribute('title');
        //alert(text);
        var des = document.getElementById('des');
        //alert(des.nodeValue); //返回 null
        //alert(des.childNodes[0].nodeValue); //该段才是获取文本节点的值
        des.childNodes[0].nodeValue = text;
    }
    //创建原素,并用appendChild追加到元素后面
    function t1(){
        var pnode = document.createElement('p');
        var text = document.createTextNode('给创建的文本节点增加内容,appendChild方法');
        pnode.appendChild(text);
         
        var art = document.getElementById('art');
        //alert(art);
        art.appendChild(pnode);
     
    }
    //利用insertBefore向元素前插入
    function t2(){
        var pnode = document.createElement('p');
        var art = document.getElementById('art');
        var zinode = art.children[0];
        art.insertBefore(pnode,zinode);//第一个参数表示待插入的,第二个是定位的位置
     
    }
 
</script>
 
<style type="text/css">
body{ background:#ccc;}
.container{ width:800px;  margin:0 auto;}
*{ margin:0; padding:0;}
ul{ list-style:none; padding:0; margin:0; width:300px; }
ul li{background:#ccc; float:left; margin-right:10px; margin-bottom:10px; margin:30px 10px;}
ul li a{ text-decoration:none; }
#gallery { border:2px solid #ccc; display:block; clear:both;}
#des{ border-bottom:1px solid red; width:400px; text-align:center; margin-bottom:10px; padding-bottom:5px; clear:both;  }
#art p{ width:200px; height:100px; background:red; margin-bottom:10px;}
</style>
</head>
 
<body>
    <div class='container'>
        <h1>My Image Gallery</h1>
        <ul>
            <li><a href='images/pic001.jpg' onmouseover="showpic(this)" onclick='return false;' title='变道车全负责' alt='' >01</a></li>
            <li><a href='images/pic002.jpg' onmouseover="showpic(this)" onclick='return false;' title='一个萝卜一个坑,一个厕所一人蹲' alt='' >02</a></li>
            <li><a href='images/pic003.jpg' onmouseover="showpic(this)" onclick='return false;' title='驶入禁止入段,造成碰撞事故' alt='' >03</a></li>
            <li><a href='images/pic004.jpg' onmouseover="showpic(this)" onclick='return false;' title='障碍物路段,避让原则' alt='' >04</a></li>
            <li><a href='images/pic005.jpg' onmouseover="showpic(this)" onclick='return false;' title='狭窄山体路段,避让原则' alt='' >05</a></li>
        </ul>
        <p id='des'>这是一段描述文字</p>
        <img id='gallery' src='images/pic001.jpg' alt='' />
        <div id='art'>
            <p>这是一个默认的P原素</p>
         
        </div>
        <p>
            <input type='button' value='增加节点' onclick='t1();' />
            <input type='button' value='往前面插入节点' onclick='t2();' />
        </p>
        <script type='text/javascript'>
            /*var des = document.getElementById('des');
            //alert(document.getElementsByTagName('a')[0].getAttribute('title'));
            des.childNodes[0].nodeValue = document.getElementsByTagName('a')[0].getAttribute('title');
            function autopic(){
                var anode =document.getElementsByTagName('ul')[0].getElementsByTagName('a');
                //alert(anode.length);
                for(var i =0 , len=anode.length ; i<len ; i++){
                    showpic(anode[i]);
                }
     
            }
            autopic();*/
        </script>
    </div>
</body>

节点关系

// 父节点
someNode.parentNode
// 子节点
someNode.childNodes
// 子节点个数
someNode.childNodes.length
// 第一个子节点
someNode.firstChild
// 最后个子节点
someNode.lastChild
// 上一个同胞节点
someNode.previousSibling
// 下一个同胞节点
someNode.nextSibling
 
// 仅元素节点 IE9 / chrome / firefox
 
// 子节点个数
someNode.childElementCount
// 第一个子节点
someNode.firstElementChild
// 最后个子节点
someNode.lastElementChild
// 上一个同胞节点
someNode.previousElementSibling
// 下一个同胞节点
someNode.nextElementSibling

补充:网页制作,Dom教程 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,