2013-06-05 24 views
16

Tôi nhân bản một vùng văn bản trong một trang nhưng phần tử nhân bản không có bất kỳ sự kiện nào của phần tử chính, có cách nào sao chép tất cả các sự kiện trong phần tử nhân bản không?Nhân bản với tất cả các sự kiện của nó

var dupNode = node.cloneNode(deep); 
+0

Có thể trùng lặp [cách sao chép nút DOM với trình xử lý sự kiện?] (Http://stackoverflow.com/questions/15408394/how-to-copy-a -dom-node-with-event-listeners) – Nickolay

Trả lời

7

Bạn có thể sử dụng getEventListeners trên các nút? Không biết hỗ trợ là gì hoặc nếu nó chỉ được hỗ trợ trong bảng điều khiển?

function cloneMassive(node) { 
    // Clone the node, don't clone the childNodes right now... 
    var dupNode = node.cloneNode(false); 
    var events = getEventListeners(node); 

    for(var p in events) { 
     // All events is in an array so iterate that array: 
     events[p].forEach(function(ev) { 
      // {listener: Function, useCapture: Boolean} 
      dupNode.addEventListener(p, ev.listener, ev.useCapture); 
     }); 
    } 
    // Also do the same to all childNodes and append them. 
    if (node.childNodes.length) { 
     [].slice.call(node.childNodes).forEach(function(node) { 
      dupNode.appendChild(cloneMassive(node)); 
     }); 
    } 

    return dupNode; 
} 

var dupBody = cloneMassive(document.body); 

Nhưng dường như getEventListeners là không thực sự được hỗ trợ:

Get event listeners attached to node using addEventListener


Nếu bạn cần phải sao chép tất cả các thuộc tính sự kiện vào nút cũng bạn sẽ cần một danh sách tất cả, và sau đó chỉ cần sao chép chúng qua:

['onclick', 'onmouseover', '...'].forEach(function(method) { 
    dupNode[method] = node[method]; 
}); 
-2

Tôi đã giải quyết vấn đề này thời gian gần đây và thậm chí rằng đây là bài cũ, chỉ trong trường hợp ai đó đang cố gắng để tìm hiểu, tôi thêm giải pháp của tôi:

var button = document.createElement("i"); 
var click = document.createAttribute("onclick"); 
click.value = "FunctionName(this)"; 
button.attributes.setNamedItem(click); 

Thay vì sử dụng addEventListener, chỉ cần tạo chức năng FunctionName. Vâng, điều này là vô dụng nếu bạn đang mở rộng các đối tượng sử dụng addEventListener

+0

Làm thế nào để trả lời câu hỏi của OP? 'StartRecorind' là gì? 'Typ' là gì? – m02ph3u5

Các vấn đề liên quan