События копии от одного элемента до другого использования jQuery

У меня есть DOM, похож на это:

<a href='javascript:void(0)' id='link1'>Element with  events bound initially</a>
<a href='javascript:void(0)' id='link2'>Element to which events are bound in future</a>

И этот JavaScript:

$(function(){
    $('#link1').bind('click',function(){alert('do something to make me happy');})
});

Теперь некоторое время в будущем, я хочу скопировать все события, привязало link1 к link2. Я делаю его, как записано ниже, предложите некоторый лучший путь если возможный или доступный.

var _elmEvents = $(#link1).data('events');

if (_elmEvents) {
    $.each(_elmEvents, function (event, handlers) {
        $.each(handlers, function (j, handler) {
            $('#link2').bind(event, handler);
        });
    });
}
20
задан jimasun 11 November 2016 в 15:28
поделиться

2 ответа

Если вы хотите скопировать все события из одного объекта в другой без клонирования, вы можете сделать это, получив прямой доступ к данным событий.

Например, если вы сделали:

$("#the_link").click(function(e){
    // do some stuff
    return false;
}.mouseover(function(e){
    // do some other stuff
});

Вы можете получить доступ к этим связям событий в данных 'событий' элемента

var events = $("#the_link").data('events');

Это будет объект, ключи которого представляют тип события, каждый из которых содержит массив ассоциаций событий . Тем не менее, вот простой пример, не считая пространств имен.

var events = $("#the_link").data('events');
var $other_link = $("#other_link");
if ( events ) {
    for ( var eventType in events ) {
        for ( var idx in events[eventType] ) {
            // this will essentially do $other_link.click( fn ) for each bound event
            $other_link[ eventType ]( events[eventType][idx].handler );
        }
    }
}
15
ответ дан 30 November 2019 в 00:55
поделиться

Вы можете клонировать элемент и манипулировать новым элементом, как хотите, однако jQuery не предоставляет простой способ копирования обработчиков событий из одного элемента в другой. Однако код, который мог бы это сделать, был бы следующим:

var events = jQuery.data( originalElement, "events" );

for ( var type in events ) {
    for ( var handler in events[ type ] ) {
        jQuery.event.add( targetElement, type, events[ type ][ handler ], events[ type ][ handler ].data );
    }
}

Но поскольку он в некоторой степени полагается на внутреннее устройство jQuery, я бы попытался найти решение, используя клонирование.

1
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: