Отключение обработчиков событий клика - PullRequest
1 голос
/ 08 июля 2010

Я пытаюсь временно отключить событие click для <div>.

Я попробовал следующее ( preview ):

$('hello').observe('click', function (e) {
    e.stop();
});

$('hello').observe('click', function (e) {
    alert('click not stopped!');
});

Однако при нажатии #hello окно предупреждения все еще появляется.Я не хочу, чтобы вызывался второй подключенный обработчик, и Я не хочу менять второй обработчик .

Я также приму решение, такое как:

$('hello').observe('click', function (e) {
    alert('click not stopped!');
});

$('hello').disableEvent('click');

// Now, handler won't be called

$('hello').observe('click', function (e) {
    alert('click not stopped (2)!');
});

// New handler won't be called, either

$('hello').enableEvent('click');

// Now, handler will be called

Я использую фреймворк Prototype.js.Похоже, это не проблема браузера.

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

Когда вы назначаете обработчики для событий; вы просто храните набор функций, которые должны быть выполнены при возникновении события.

Когда происходит событие, добавленные вами обработчики выполняются в порядке их добавления . Так что, если вам нужно добавить три обработчика в событие click для div:

$("div").observe("click", function ()
{
    alert("one");
});

$("div").observe("click", function ()
{
    alert("two");
});

$("div").observe("click", function ()
{
    alert("three");
});

.. вы получите три предупреждения («один», «два» и «три»), когда сработает событие click элемента div. Эти три предупреждения будут отображаться, если вы введете:

$("div").observe("click", function (e)
{
    e.stop();
})

.. потому что вы отменяете событие только для одного конкретного обработчика. Не все связанные обработчики.


Поэтому вам нужно будет использовать ссылочную переменную, которая отслеживает, разрешено ли запускать событие click:

var cancelClickEvent = true;

$("div").observe("click", function ()
{
    // if cancelClickEvent is true, return the function early, to
    // stop the code underneath from getting executed
    if (cancelClickEvent) return;

    // your code goes here
});

Затем вам нужно будет реализовать вышеуказанное условие if во всех ваших обработчиках.

0 голосов
/ 08 июля 2010

Как я уже сказал в комментариях к ответу roosteronacid , я написал расширение к Event.observe. Работает в большинстве браузеров, но не IE .

// XXX HACK XXX
(function () {
    var handlerCache = $A([ ]);

    function findHandler(either) {
        var pair = handlerCache.find(function (pair) {
            return $A(pair).member(either);
        });

        return pair && pair[0];
    }

    function addHandler(handler) {
        function newHandler(e) {
            if (!e.halted) {
                handler.apply(this, arguments);
            }
        }

        handlerCache.push([ handler, newHandler ]);

        return newHandler;
    }

    Event.observe = Event.observe.extended(function ($super, element, eventName, handler) {
        handler = findHandler(handler) || addHandler(handler);

        $super(element, eventName, handler);
    });

    Event.stopObserving = Event.stopObserving.extended(function ($super, element, eventName, handler) {
        handler = findHandler(handler) || handler;

        $super(element, eventName, handler);
    });

    Element.addMethods({
        observe: Event.observe
    });

    Event.prototype.halt = function () {
        this.halted = true;
    };
}());

Примечание: Function.prototype.extended - это пользовательская функция, которая помещаеторигинал Event.observe в виде $super.

0 голосов
/ 08 июля 2010

Разве вы не можете просто установить для свойства disabled объекта значение true?

...