Приостановка событий слушателей - PullRequest
2 голосов
/ 27 марта 2012

У меня есть кнопка с подключенным прослушивателем событий onclick (в MooTools).Работает нормально.Однако я хочу иметь возможность сделать кнопку недоступной в определенное время и сделать ее снова доступной при необходимости.

Проще говоря: я хочу «приостановить» прослушиватель событий.Можно ли это сделать?Документы MooTools используются только для добавления, удаления, клонирования и распространения событий.Не «игнорируя» их некоторое время.

Я понимаю, что решение для этого может лежать в другом месте:

  1. Скройте кнопку с помощью некоторого css, например, $('button').setStyle('visibility', 'hidden'), и дайте ему появитьсяпозже
  2. Некоторое наложение, снова скрывающее исходный элемент и показывающее замену (например, серая кнопка)
  3. Клонирование элемента, удаление всех событий из оригинала (создание кнопки 'недоступен '), затем замените оригинал клоном (таким образом сделав его снова доступным)
  4. Пусть функция, присоединенная к слушателю событий, проверит, доступна ли кнопка

Однако, это немного не относится к делу и кажется более сложным, чем необходимо.Мой вопрос заключается в том, могу ли я и как контролировать слушателя событий, в основном: могу ли я его приостановить?

РЕДАКТИРОВАТЬ:

Я предполагаю, что ответ «нет».Это означает выполнение одной из четырех вещей, упомянутых выше, или как указано в ответе, который я принял: отключить HTML-элемент кнопки, тем самым приостановив ответ для прослушивателей событий.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Я бы увидел два способа сделать это:

  1. Отключить элемент.Когда элемент имеет состояние disabled, прослушиватели событий на нем отключаются.
  2. Удалите прослушиватель событий.Это означает, что вы должны повторно добавить его, как только захотите включить его снова.Это означает, что вы можете добавить свой код для добавления события в функцию, чтобы его можно было повторно использовать.
1 голос
/ 31 марта 2012

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

Хотя, на мой взгляд, правильный способ решения вашей проблемы - добавить класс css (помните, что вы можете добавить любое количество классов по своему усмотрению) к своей "кнопке" (где кнопка может быть элементом любого типа) и проверить наличие этого класса в вашем обработчике кликов с помощью решения, подобного этому:

$('button.one').addEvent('click', function(){
   if(this.hasClass('disabled'))return;    
   alert('You just clicked me, guy!');
});

как в этом примере:

http://jsfiddle.net/kentaromiura/CUeC4/

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

Element.Events.enabledClick = {
base:'click',
condition: function(event){
     var trigger = true;
     if(this.hasClass('disabled')){
        trigger = false;
     }
     return trigger;
}};

поэтому в любое время, когда вам нужно перевести обработчик событий в спящий режим, вы просто добавляете «отключенный» класс на нужную кнопку и забываете его, чтобы повторно включить событие, просто удалите «отключенный» класс, вместо addEvent ('click', ...) вы просто используете addEvent ('enabledClick', ...)

на этой скрипке тот же пример, что и выше, используя эту технику: http://jsfiddle.net/kentaromiura/yUnqw/

В моем примере я только что использовал класс .disabled в css для стилизации кнопки как отключенной, но если вы хотите, чтобы она исчезла, вы можете использовать tween для установки прозрачности:

http://jsfiddle.net/kentaromiura/KLqAc/

0 голосов
/ 27 марта 2012

Если библиотека не поддерживает приостановку события, другой вариант будет просто установить флаг, когда вы хотите его игнорировать, а затем проверить его в начале вашей функции:

function doStuff() {
    if (myFlag) {
        return;
    }
}
...