使用DOM.replaceChild需要注意的一些問題

方法:

DOM.replaceChild( newNode, oldNode )

該DOM對象的方法接受2個參數,第一個代表新DOM節點,第二個代表要被替換的節點,其中第二個參數必須是該DOM的子元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            border: solid;
        }
        div#d2{
            border-color: red;
        }
    </style>
</head>
<body>
    <button id="ipt">替換</button>
    <div id="d1"><span id="rep">一個span</span></div>
    <div id="d2"><span id="berep">被替換的span</span></div>
</body>
<script>
    var $ = s=>document.querySelectorAll(s);
    var [ ipt, d1, rep, d2, berep ] = [...$('[id]')];//請參考html中的id
    ipt.onclick = func=>{
        d2.replaceChild( rep , berep );//替換
    }
</script>
</html>

需要注意的是:在函數調用以后,如果newNode在DOM樹中,newNode就會移動到該DOM元素的子節點

替換前
替換后

如果要保留原節點,請用cloneNode()方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            border: solid;
        }
        div#d2{
            border-color: red;
        }
    </style>
</head>
<body>
    <button id="ipt">替換</button>
    <div id="d1"><span id="rep">一個span</span></div>
    <div id="d2"><span id="berep">被替換的span</span></div>
</body>
<script>
    var $ = s=>document.querySelectorAll(s);
    var [ ipt, d1, rep, d2, berep ] = [...$('[id]')];
    ipt.onclick = func=>{
        d2.replaceChild( rep.cloneNode(true) , berep );//true代表連同子節點一起克隆
    }
</script>
</html>

點擊第一次,沒什么問題:


QQ截圖20171103165459.png

然而點擊第二次,就會報錯:


QQ截圖20171103165504.png

原因在于:

d2.replaceChild( rep.cloneNode(true) , berep );

中的berep已經被替換,不再是d2的子節點了
若想保證腳本正常運行,需要傳入d2當前的子節點而非被替換掉的berep

d2.replaceChild( rep.cloneNode(true) , d2.children[0] )

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本章內容 理解包含不同層次節點的 DOM 使用不同的節點類型 克服瀏覽器兼容性問題及各種陷阱 DOM 是針對 HT...
    悶油瓶小張閱讀 668評論 0 1
  • 1. 什么是DOM 文檔對象模型 (DOM) 是HTML和XML文檔的編程接口。它提供了對文檔的結構化的表述,并定...
    hanyuntao閱讀 1,298評論 0 4
  • 什么是DOM??? DOM(Document Object Model 文檔對象模型)是針對HTML和XML文檔的...
    熒惑3_3閱讀 1,412評論 0 1
  • 福州課程結束,終于回到wuli大美新疆。回來幾乎天天都在吃肉,今天開始辟谷… 非常幸運的是朋友一家去伊犁玩,然后帶...
    點滴XY閱讀 417評論 8 2
  • 【2013.8.6】 【闌邊偷唱系瑤簪,前事總堪惆悵,寒風生,羅衣薄,萬般心】 使一把小巧玲瓏的剪口鉗,將一段雪色...
    蘇若容閱讀 383評論 0 3