У меня есть 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);
});
});
}
Если вы хотите скопировать все события из одного объекта в другой без клонирования, вы можете сделать это, получив прямой доступ к данным событий.
Например, если вы сделали:
$("#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 );
}
}
}
Вы можете клонировать элемент и манипулировать новым элементом, как хотите, однако 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, я бы попытался найти решение, используя клонирование.