Кто-нибудь знает, как развязать набор обработчиков событий, но запомнить их, чтобы связать их позже? Любые предложения?
JQuery: Отключить обработчики событий, чтобы связать их позже
Ответ 1
В данных элемента есть элемент событий. Это должно начаться, вы можете прочитать свои элементы и сохранить обработчики в массиве перед отсоединением. Комментарий, если вам нужна дополнительная помощь. Я получил эту идею от чтения метода $.fn.clone, поэтому взгляните на это.
$(document).ready(function() {
$('#test').click(function(e) {
alert('test');
var events = $('#test').data("events");
$('#test').unbind('click', events.click[0]);
});
});
<a id="test">test</a>
Ответ 2
Вот как это сделать, предоставляет методы storeEvents
и restoreEvents
для выбора. storeEvents
принимает моментальный снимок событий в момент его вызова. restoreEvents
восстанавливается до последнего предыдущего моментального снимка. Может потребоваться немного закрутить его для параметризации открепления при восстановлении, возможно, вы захотите сохранить связанные события после последнего моментального снимка.
(function($){
function obj_copy(obj){
var out = {};
for (i in obj) {
if (typeof obj[i] == 'object') {
out[i] = this.copy(obj[i]);
}
else
out[i] = obj[i];
}
return out;
}
$.fn.extend({
storeEvents:function(){
this.each(function(){
$.data(this,'storedEvents',obj_copy($(this).data('events')));
});
return this;
},
restoreEvents:function(){
this.each(function(){
var events = $.data(this,'storedEvents');
if (events){
$(this).unbind();
for (var type in events){
for (var handler in events[type]){
$.event.add(
this,
type,
events[type][handler],
events[type][handler].data);
}
}
}
});
return this;
}
});
})(jQuery);
Ответ 3
Так как jQuery 1.4.2+ изменяет порядок хранения обработчиков событий, это кажется актуальным:
Лучший способ, которым я нашел, - использовать пространство имен событий:
var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ];
for ( idx = 0; idx < ary_handlers.length; idx++ ){
$('#test').bind('click.foobar',ary_handlers[idx]);
}
// and then later:
$('#test').unbind('.foobar');
В приведенном выше примере все события foobar unbound. Обратите внимание, что если вам нужен более тонкий контроль зерна, вы можете пропустить пробел каждого обработчика кликов и соотнести его с массивом обработчиков:
var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ];
for ( idx = 0; idx < ary_handlers.length; idx++ ){
$('#test').bind('click.ns_' + String(idx), ary_handlers[idx]);
}
// and then later you could pick off a specific one to unbind
$('#test').unbind('.ns_2');
Ответ 4
Теперь есть хороший плагин jQuery под названием copyEvents, который копирует события из одного объекта в другой. Это можно было бы легко использовать для "сохранения" событий из одного элемента и возврата их позже. Еще один вариант:)
Ответ 5
Чтобы развязать обработчик событий, вам нужно передать функцию обработчика в unbind(). Итак, у вас уже есть функция обработчика, все, что вам нужно сделать, это запомнить ее.
Ответ 6
Вы можете использовать параметр event.handler
:
$(document).ready(function() {
$('#test').click(function(e) {
e.preventDefault();
alert('test');
$('#test').unbind('click', e.handler);
//Do Something...
$('#test').click();
});
});
<a id="test">test</a>
event.handler
возвращает текущий обработчик, получивший событие, поэтому, опуская его, вы можете сохранить другие обработчики.
Ответ 7
У Nick Craver есть правильный ответ для jQuery 1.4.2+. Он также включает полезный fiddle. Его решение позволяет получить все обработчики событий, прикрепленные к элементу jQuery, и выяснить, к какому обработчику они были привязаны.