js原生API中有個cloneNode,還有一個可選的參數,html
true表明複製子節點,包括任何包裹在標籤之間的東西,固然包括文本節點,也就是標籤之間有什麼,它就會不假思索的所有都克隆一份。app
false表明只複製節點自己,節點之間的任何東西都不用複製。dom
有時候,這個參數對於某些狀況true false是相等的,好比沒有任何子節點的複製,eg<div></div>this
這不是本文所闡述的,本文闡述的是cloneNode在各類使用狀況下對因而否複製事件表現的差別性:htm
例子頁面:事件
<!doctype html>
<html>
<body>
<div id="myDiv" >
this is my div
</div>
</body>ip
添加事件get
eg1.io
<div id="myDiv" onclick="sayHello();">
this is my div
</div>function
<script>
var elem = document.getElementById("myDiv");
//1.假若放在dom節點屬性onclick方法上,複製節點會複製出事件,新生成的dom也會附帶上click事件
function sayHello(){
alert("say hello");
}
document.body.appendChild(elem.cloneNode(true));
</script>
eg2.
<div id="myDiv" >
this is my div
</div>
<script>
var elem = document.getElementById("myDiv");
//2.直接註冊節點的click事件,cloneNode不會複製出事件
function sayHello(){
alert("say hello");
}
elem.onclick = sayHello();
document.body.appendChild(elem.cloneNode(true));
</script>
eg3.
<div id="myDiv" >
this is my div
</div>
<script> function addEvent(elem, type, fn){ //cloneNode的時候,由此方法添加事件,新生產的節點會複製出事件 if(elem.attachEvent){ elem.attachEvent("on" + type, fn); //cloneNode的時候,由此此方法添加事件,新生產的節點不會複製出事件 }else if(elem.addEventListener){ elem.addEventListener(type, fn, false); } } var elem = document.getElementById("myDiv"); function sayHello(){ alert("say hello"); } addEvent(elem, "click", sayHello); document.body.appendChild(elem.cloneNode(true)); </script>