JQuery временные события привязки - PullRequest
12 голосов
/ 04 августа 2010

возможно я что-то упускаю даже из-за обработки в jQuery, но вот моя проблема.

Давайте предположим, что есть какая-то привязка к событию, например

$(element).bind("mousemove", somefunc);

Теперь я хотел бы ввести новую привязку перемещения мыши, которая не отменяет предыдущую, но временно исключает (отменяет привязку) ее. Другими словами, когда я связываю свою функцию, я должен быть уверен, что никакие другие функции никогда не будут выполняться для этого события, пока я не восстановлю их.

Я ищу что-то вроде:

$(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 не находится под моим контролем, или это было бы бесполезно:)

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

Как я могу это сделать? заранее спасибо ~ Aki

РЕДАКТИРОВАТЬ: Мне нужно выделить это: мне нужно, чтобы ранее установленный обработчик (somefunc) не выполнялся. Я НЕ определяю этот обработчик, он может присутствовать или не присутствовать, но он установлен сторонним пользователем.

EDIT2: Хорошо, сейчас это невозможно, я думаю, что мне нужен eventListenerList, который еще не реализован в большинстве браузеров. http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html

Ответы [ 2 ]

7 голосов
/ 04 августа 2010

Другим способом может быть использование пользовательских событий, что-то вроде этого:

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/

0 голосов
/ 04 октября 2015

Хорошо, если событие связано с несколькими элементами:

$('.foo').click(function() {
    if ( ! $(this).hasClass('flag')) {
        do something
    }
});

(добавить класс 'flag' для сортировки unbind, добавить его в 'bind')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...