JavaScript cloneNode() 克隆節點

admin發表於2018-10-29

cloneNode() 方法可以克隆一個節點,根據引數的不同進行淺拷貝或深拷貝。

下面會結合程式碼例項對此方法的使用進行詳細分析。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
Node.cloneNode(deep)

引數解析:

(1).Node:將要被克隆的節點。

(2).deep: 可選,布林值,預設值為 false,規定是否進行深度克隆,如果引數為 true,將克隆 Node 節點以及它的後代節點,如果引數為 false,只克隆 Node 節點本身。

瀏覽器支援:

(1).IE 瀏覽器支援此方法。

(2).edge 瀏覽器支援此方法。

(3).谷歌瀏覽器支援此方法。

(4).opera 瀏覽器支援此方法。

(5).火狐瀏覽器支援此方法。

(6).safari 瀏覽器支援此方法。

程式碼例項:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
div{
  width:100px;
  height:100px;
  background-color:blue;
  margin:5px;
}
</style>
<script>
window.onload=function(){
  let odiv=document.getElementsByTagName("div")[0];
  let obt=document.getElementById("bt");
  obt.onclick=function(){
    let cloneNode=odiv.cloneNode();
    document.body.appendChild(cloneNode);
  }
}
</script>
</head>
<body>
<input type="button" id="bt" value="檢視演示"/>
<div></div>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201810/29/123553yconnmm95um5tznn.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).點選按鈕後,首先會克隆div,cloneNode方法預設引數是false。

(2).然後通過appendChild方法將其追加到body中去。

cloneNode方法預設引數為false,採用淺克隆,也就是隻克隆Node節點本身。

程式碼演示如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
div{
  width:100px;
  height:100px;
  line-height:100px;
  text-align:center;
  background-color:blue;
  margin:5px;
}
</style>
<script>
window.onload=function(){
  let odiv=document.getElementsByTagName("div")[0];
  let obt=document.getElementById("bt");
  obt.onclick=function(){
    let cloneNode=odiv.cloneNode();
    document.body.appendChild(cloneNode);
  }
}
</script>
</head>
<body>
<input type="button" id="bt" value="檢視演示"/>
<div>螞蟻部落</div>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201810/29/123622seqooqajkmavmkmx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由於使用的是淺拷貝,所以只會拷貝div節點本身,它的後代節點並不會被一同拷貝。

對於<img>或者<input>等空元素,無所謂淺拷貝或者深拷貝,它們沒有子節點。

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
.ant{
  width:100px;
  height:100px;
  line-height:100px;
  text-align:center;
  background-color:blue;
  color:red;
  margin:5px;
}
</style>
<script>
window.onload=function(){
  let odiv=document.getElementsByTagName("div")[0];
  let obt=document.getElementById("bt");
  obt.onclick=function(){
    let cloneNode=odiv.cloneNode(true);
    document.body.appendChild(cloneNode);
  }
}
</script>
</head>
<body>
<input type="button" id="bt" value="檢視演示"/>
<div class="ant">螞蟻部落</div>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201810/29/123647lkg5nrz9qcckmrr1.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

被克隆的元素背景顏色依然是藍色,字型顏色同樣也是紅色。

這說明,元素的屬性同樣會被克隆,但是有例外:

(1).addEventListener註冊的事件處理函式不會被克隆。

(2).dom.onclick類似註冊的事件處理函式不會被克隆。

(3).<div>螞蟻部落</div>此種類似方式註冊的事件處理函式會被克隆。

還有一點需要注意,避免id屬性值重複,如果被克隆元素具有id屬性。

那麼新克隆的元素要修改一下屬性值,以避免出現此情況。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
div{
  width:100px;
  height:100px;
  line-height:100px;
  text-align:center;
  background-color:blue;
  margin:5px;
}
</style>
<script>
window.onload=function(){
  let odiv=document.getElementsByTagName("div")[0];
  let obt=document.getElementById("bt");
  obt.onclick=function(){
    let cloneNode=odiv.cloneNode();
    cloneNode.id="mayi";
    document.body.appendChild(cloneNode);
  }
}
</script>
</head>
<body>
<input type="button" id="bt" value="檢視演示"/>
<div id="ant">螞蟻部落</div>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201810/29/123712kqvp80n0ee9o3olx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

動態修改了新元素的id屬性值。

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
div{
  width:200px;
  height:100px;
  text-align:center;
  background-color:blue;
  margin:5px;
}
</style>
<script>
window.onload=function(){
  let odiv=document.getElementsByTagName("div")[0];
  let obt=document.getElementById("bt");
  obt.onclick=function(){
    let txtNode=odiv.childNodes[0];
    let newTxtNode=txtNode.cloneNode();
    odiv.appendChild(newTxtNode);
  }
}
</script>
</head>
<body>
<input type="button" id="bt" value="檢視演示"/>
<div>螞蟻部落</div>
</body>
</html>

由於對元素節點的操作佔絕大多數,所以不要想當然認為此方法是針對元素節點的。

上述程式碼實現了對文字節點的拷貝操作,非常簡單,不多介紹。

相關文章