Клонировать элемент со всеми его событиями - программирование
Подтвердить что ты не робот

Клонировать элемент со всеми его событиями

Я клонирую текстовую область на странице, но клонированный элемент не имеет никакого события первичного элемента, есть ли способ клонировать все события в клонированном элементе?

var dupNode = node.cloneNode(deep);
4b9b3361

Ответ 1

Вы можете использовать getEventListeners для узлов? Не знаете, как поддерживается поддержка, или если она поддерживается только в консоли?

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);

Но похоже, что getEventListeners не поддерживается:

Получить прослушиватели событий, прикрепленные к node с помощью addEventListener


Если вам нужно скопировать все свойства события на node, вам также понадобится список всех, а затем просто скопируйте их:

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

Ответ 2

В последнее время я решал эту проблему, и даже это старый пост, на всякий случай кто-то пытается выяснить, я добавляю свое решение:

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

Вместо использования addEventListener просто создайте функцию FunctionName. Ну, это бесполезно, если вы расширяете объекты, которые используют addEventListener