insertAfter()方法------在節點后面插入節點


DOM提供了insertBefore()方法,可以在某一個節點前面插入節點,但有時候需要在某一個節點后面插入節點,這就是insertAfter()方法。(From:JavaScript DOM編程藝術)

函數名:insertAfter()

參數:newElement:要添加的節點,targetElement:目標節點

1 function insertAfter(newElement,targetElement) {
2     var parent = targetElement.parentNode;//獲取目標節點的父級標簽
3     if(parent.lastChild == targetElement) {//如果目標節點正好是最后一個節點,使用appendChild插入
4         parent.appendChild(newElement);
5     } else {
6         parent.insertBefore(newElement,targetElement.nextSibling);//一般情況下要取得目標節點的下一個節點,再使用insertBefore()方法。
7     }
8 }

無論是insertBefore()還是insertAfter(),都是針對DOM節點樹而言的,所有最基本的這倆個函數對元素節點和文本節點都有效。

測試一:DOM節點樹中是否包含屬性節點。

<html>
<head>
</head>
<body>
    <div id="parentNode">
        <h1 id="childElementNode01">this is childNode01</h1>
        <h1 id="childElementNode02">this is childNode02</h1>
        <h1 id="childElementNode03">this is childNode03</h1>
    </div>
    <script>
        var targetElement = document.getElementById("childElementNode02");
        var parentElement = targetElement.parentNode;
        //alert(parentElement.nodeName);//DIV
        //alert(parentElement.nodeType);//1
        //alert(parentElement.childNodes.length);//7,有7個childNode
        /*第一個子節點*/
        //alert(parentElement.childNodes[0].nodeName);//#text
        //alert(parentElement.childNodes[0].nodeType);//3,文本節點
        //alert(parentElement.childNodes[0].nodeValue);//空值
        /*第二個子節點*/
        //alert(parentElement.childNodes[1].nodeName);//H1
        //alert(parentElement.childNodes[1].nodeType);//1,元素節點
        //alert(parentElement.childNodes[1].nodeValue);//null
        /*第三個子節點*/
        //alert(parentElement.childNodes[2].nodeName);//#text
        //alert(parentElement.childNodes[2].nodeType);//3,文本節點
        //alert(parentElement.childNodes[2].nodeValue);//空值
        /*第四個子節點*/
        //alert(parentElement.childNodes[3].nodeName);//H1
        //alert(parentElement.childNodes[3].nodeType);//1,元素節點
        //alert(parentElement.childNodes[3].nodeValue);//null
    </script>
</body>
</html>

可以看到,文本節點和元素節點是同胞關系,這里測試用的是firefox,它把TAB和換行都當成了文本節點,所以才會出現7個子節點。

需要注意的是屬性節點並不包含在7個子節點中,也就是說,屬性節點並不包含在DOM節點樹中

事實上,屬性節點代表了元素中的屬性。在DOM API中,屬性節點是通過org.w3c.dom.Attr接口來表示的。因為屬性實際上是附屬於元素的,所以屬性節點不能看做元素節點的子節點,

因而在DOM中,屬性沒有被認為是DOM節點樹中的一部分,在屬性節點上調用getparentNode()、getPreviousSilbling()和getNextSilbling()方法返回的都是null。

也就是說,元素節點被看成包含它的元素節點的一部分,並不是單獨的作為節點存在於DOM節點樹中,屬性節點並不是“節點”。

測試二:insertBefore()方法是否是作用於整個DOM節點樹的。

<html>
<head>
</head>
<body>
    <div id="parentDivNode">
        <h1 id="childElementNode01">this is childElementNode01</h1>
        <h1 id="childElementNode02">this is childElementNode02</h1>
        <h1 id="childElementNode03">this is childElementNode03</h1>
    </div>
    <script>
        var parentDivNode = document.getElementById("parentDivNode");
        var childNode03 = parentDivNode.childNodes[2];//文本節點
        var childNode04 = parentDivNode.childNodes[3];//元素節點
        /*新建文本節點*/
        var newTextNode = document.createTextNode("newTextNode");
        /*新建元素節點*/
        var elementNode = document.createElement("h1");
        var elementNode_textNode = document.createTextNode("elementNode");
        elementNode.appendChild(elementNode_textNode);
        //分4中情況插入DOM 節點樹中,insertBefore的2個參數
        //1、文本節點,文本節點
        //parentDivNode.insertBefore(newTextNode,childNode03);
        //alert(parentDivNode.childNodes.length);//8
        //2、文本節點,元素節點
        //parentDivNode.insertBefore(newTextNode,childNode04);
        //alert(parentDivNode.childNodes.length);//8
        //3、元素節點,文本節點
        //arentDivNode.insertBefore(elementNode,childNode03);
        //lert(parentDivNode.childNodes.length);//8
        //4、元素節點,元素節點
        parentDivNode.insertBefore(elementNode,childNode04);
        alert(parentDivNode.childNodes.length);//8
    </script>
</body>
</html>

結論:insertBefore()方法是作用於整個節點樹的

測試三:insertAfter()方法是否是作用於整個DOM節點樹的。

<html>
<head>
    <script>
        function insertAfter(newElement,targetElement) {
            var parent = targetElement.parentNode;//獲取目標元素的父級標簽
            if(parent.lastChild == targetElement) {
                parent.appendChild(newElement);
            } else {
                parent.insertBefore(newElement,targetElement.nextSibling);
            }
        }
    </script>
</head>
<body>
    <div id="parentDivNode">
        <h1 id="childElementNode01">this is childElementNode01</h1>
        <h1 id="childElementNode02">this is childElementNode02</h1>
        <h1 id="childElementNode03">this is childElementNode03</h1>
    </div>
    <script>
        var parentDivNode = document.getElementById("parentDivNode");
        var childNode03 = parentDivNode.childNodes[2];//文本節點
        var childNode04 = parentDivNode.childNodes[3];//元素節點
        /*新建文本節點*/
        var newTextNode = document.createTextNode("newTextNode");
        /*新建元素節點*/
        var elementNode = document.createElement("h1");
        var elementNode_textNode = document.createTextNode("elementNode");
        elementNode.appendChild(elementNode_textNode);
        //分4中情況插入DOM 節點樹中,insertAfter的2個參數
        //1、文本節點,文本節點
        //insertAfter(newTextNode,childNode03);
        //alert(parentDivNode.childNodes.length);//8
        //2、文本節點,元素節點
        //insertAfter(newTextNode,childNode04);
        //alert(parentDivNode.childNodes.length);//8
        //3、元素節點,文本節點
        //insertAfter(elementNode,childNode03);
        //alert(parentDivNode.childNodes.length);//8
        //4、元素節點,元素節點
        //insertAfter(elementNode,childNode04);
        //alert(parentDivNode.childNodes.length);//8
    </script>
</body>
</html>

結論:insertAfter()方法是作用於整個節點樹的,DOM樹中的節點都是繼承自Node類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM