IE8- の Node#cloneNode はイベントまでコピーする
DOM2 規定の cloneNode()
DOM Level 2 Core で規定されている Node#cloneNode は「すべての属性と値をコピーします」が、参照は新しく形成されます。
つまり、<p onclick="alert('click');">
のようにHTMLに埋め込んであるイベントはコピーしますが、addEventListener 等で形成されたイベントはコピーしません。
<p id="Sample-1" onclick="alert('onclick attribute')">Click Me!</p> <script type="text/javascript"> (function () { var p = document.getElementById('Sample-1'); p.addEventListener('click', function () { alert('EventListener click'); }, false); p = p.cloneNode(true); // クローンを生成する p.id = 'Sample-2'; document.body.appendChild(p.cloneNode(true)); })(); </script>
IE8- の cloneNode()
IE8- の cloneNode() は attachEvent で形成されたイベントまでコピーします。(IE9で修正済みとの事)
<p id="Sample-1" onclick="alert('onclick attribute')">Click Me!</p> <script type="text/javascript"> (function () { var p1 = document.getElementById('Sample-1'); p1.attachEvent('onclick', function () { alert('attached click'); }); var p2 = p.cloneNode(true); // クローンを生成する p2.id = 'Sample-2'; document.body.appendChild(p2.cloneNode(true)); p1.style.color = 'red'; })(); </script>
IE の cloneNode は似て非なるもの - latest logではIE の cloneNode は参照をコピーするように説明されていますが、IE8 では参照をコピーしないようです。IE7- もしくは IE6- では参照をコピーするのかもしれません。