Временные события разворота jquery
Может быть, я вообще что-то пропустил даже в обработке jQuery, но вот моя проблема.
Предположим, что есть привязка к событию, например
$(element).bind("mousemove", somefunc);
Теперь я хотел бы ввести новую привязку mousemove, которая не отменяет предыдущую, но временно исключает (отвязывает) ее. Другими словами, когда я связываю свою функцию, я должен быть уверен, что никакие другие функции никогда не будут выполняться для этого события, пока я не восстановил их.
Я ищу что-то вроде:
$(element).bind("mousemove", somefunc);
// Somefunc is used regularly
var savedBinding = $(element).getCurrentBinding("mousemove");
$(element).unbind("mousemove").bind("mousemove", myfunc);
// Use myfunc instead
$(element).unbind("mousemove", myfunc).bind("mousemove", savedBindings);
Конечно, somefunc не находится под моим контролем, или это бесполезно:)
Я понимаю, что можно связать несколько функций с одним и тем же событием и что выполнение этих функций невозможно заранее определить.
Я знаю о прекращении распространения события и немедленного распространения событий, но я думаю, что они бесполезны в моем случае, поскольку порядок выполнения не может быть определен (но, возможно, я ошибаюсь).
Как я могу это сделать?
заранее спасибо
~ Аки
EDIT: Мне нужно выделить это: мне нужно, чтобы ранее установленный обработчик (somefunc) не выполнялся. Я НЕ определяю этот обработчик, он может быть или может отсутствовать, но он установлен сторонним пользователем.
EDIT2: Хорошо, сейчас это невозможно, мне кажется, что мне нужен eventListenerList, который еще не реализован в большинстве браузеров. http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html
Ответы
Ответ 1
Другим способом может быть использование пользовательских событий, что-то в этом роде:
var flag = 0;
$(element).bind("mousemove", function() {
if(flag) {
$(this).trigger("supermousemove");
} else {
$(this).trigger("magicmousemove");
}
}).bind("supermousemove", function() {
// do something super
}).bind("magicmousemove", function() {
// do something magical
});
$("#foo").click(function() {
flag = flag == 1 ? 0 : 1; // simple switch
});
Очень раздражающая демонстрация здесь: http://jsfiddle.net/SkFvW/
Ответ 2
Хорошо, если событие связано с несколькими элементами:
$('.foo').click(function() {
if ( ! $(this).hasClass('flag')) {
do something
}
});
(добавьте класс 'flag' для сортировки unbind, добавьте его в 'bind')