2009-01-14 2 views
9

Как вы копируете обработчик событий из одного элемента в другой? Например:Дублировать обработчики событий одного элемента на другой?

$('#firstEl') 
    .click(function() { 
     alert("Handled!"); 
    }) 
; 

// here's where the magic happens 
$('#secondEl').click = $('#firstEl').click; // ???? 

Обратите внимание, что второй элемент редактируется в другое время, когда первый элемент получает свой обработчик, а это означает, что это:

$('#firstEl, #secondEl').click(function() { ... }); 

... не будет Работа.

+0

К сожалению, ни один из ответов не показывать без использования JQuery. –

+0

@ShaneReustle это вопрос о событиях jQuery ... – nickf

+0

Какие в фоновом режиме работают как обычные события. Я надеялся увидеть, как это сделать, не используя jQuery для стандартных событий JS. –

ответ

4

Вы не можете легко (и, вероятно, не должны) «копировать» событие. Что вы можете сделать, это использовать ту же функцию для обработки каждый:

var clickHandler = function() { alert('click'); }; 
// or just function clickHandler() { alert('click'); }; 

$('#firstEl').click(clickHandler); 

// and later 
$('#secondEl').click(clickHandler); 

В качестве альтернативы вы можете на самом деле стрелять событие для первого элемента во втором обработчика:

$('#firstEl').click(function() { 
    alert('click'); 
}); 

$('secondEl').click(function() { 
    $('#firstEl').click(); 
}); 

Edit: @nickf беспокоит загрязнять глобальное пространство имен, но это почти всегда можно избежать путем оборачивания кода в объекте:

function SomeObject() { 
    this.clickHandler = function() { alert('click'); }; 
} 
SomeObject.prototype.initFirstEvent = function() { 
    $('#firstEl').click(this.clickHandler); 
}; 
SomeObject.prototype.initSecondEvent = function() { 
    $('#secondEl').click(this.clickHandler); 
}; 

или оборачивать код в анонимную функцию и сразу же называть его:

(function() { 
    var clickHandler = function() { alert('click'); }; 
    $('#firstEl').click(clickHandler); 
    $('#secondEl').click(clickHandler); 
})(); 
+0

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

+0

@nickf: Я отредактировал свое сообщение в ответ на вашу озабоченность. – Prestaul

0

Это вы что искали? ..

var clickHandler = function() { alert("Handled!"); } 
$('#firstEl').click(clickHandler); 
$('#secondEl').click(clickHandler); 
1

Вы могли бы быть заинтересованы в triggerHandler method

// here's where the magic happens 
//$('#secondEl').click = $('#firstEl').click; // ???? 
$('#secondEl').click(function() { 
    $('#firstEl').triggerHandler('click'); 
}); 
21

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

> см. Нижеизменение!

// iterate event types of original 
$.each($('#original').data('events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

Это удобно, если вы не имеете никакого контроля исходного элемента (например, при использовании плагина) и просто хочет, чтобы клонировать поведение определенного элемента.

Редактировать: Доступ к обработчикам событий элементов был изменен в более поздних версиях jQuery. Это должно работать на более новые версии:

$.each($._data($('#original').get(0), 'events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

Приветствие

+0

Использование метода 'triggerHandler()' JQuery - лучшее решение. @KenBrowing имеет ответ на это ниже: http://stackoverflow.com/a/442305/1988326 –

+1

@ Крис: Спасибо за редактирование. После поиска дней для решения для сохранения событий и обработки их позже это единственное место, где я нашел, где описывается доступ к обработчикам событий jquery. Большое спасибо :) – zreptil

Смежные вопросы