Подтвердить что ты не робот

Временные события разворота 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

4b9b3361

Ответ 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')