Как "отменить" событие click после unbind ('click')?

У меня есть якорный тег <a class="next">next</a>, сделанный в "button". Иногда этот тэг нужно скрывать, если нет ничего нового для показа. Все работает нормально, если я просто спрячу кнопку с .hide() и повторно отобразите ее с помощью .show(). Но вместо этого я хотел использовать .fadeIn() и .fadeOut().

Проблема заключается в том, что если пользователь нажимает кнопку во время анимации fadeOut, это может вызвать проблемы с логикой, которую я запускаю показ. Решение, которое я нашел, состояло в том, чтобы отменить событие click от кнопки после начала первоначальной функции щелчка, а затем повторно связать ее после завершения анимации.

$('a.next').click(function() {
    $(this).unbind('click');
    ...
    // calls some functions, one of which fades out the a.next if needed
    ...
   $(this).bind('click');
}

последняя часть приведенного выше примера не работает. Событие клика на самом деле не привязано к привязке. кто-нибудь знает правильный способ сделать это?

Я парень-самоуверенный jquery, поэтому некоторые из вещей более высокого уровня, такие как unbind() и bind(), над моей головой, и документация jquery на самом деле не достаточно проста для понимания.

Ответы

Ответ 1

Я бы просто добавил чек, чтобы увидеть, анимирует ли он сначала:

$('a.next').click(function() {
    if (!$(this).is(":animated")) {
        // do stuff
    }
});

Ответ 2

Когда вы перепроверяете событие click, вы начинаете все заново. Вам необходимо предоставить функцию, которую вы собираетесь обрабатывать событиями. jQuery не помнит их для вас после вызова "unbind".

В этом конкретном случае это немного сложнее. Проблема в том, что при запуске этих анимаций вы настраиваете в действие ряд действий, которые управляются таймером. Таким образом, отключение и переупорядочение обработчика "click" внутри самого обработчика кликов действительно ничего не поможет. Что помогло бы (при условии, что вы не хотите решить проблему с трюком is(":animated")), было бы отвязать обработчик, а затем перестроить обратный вызов "завершить" из вашей анимации.

Когда вы сначала настроите обработчик "click", вы можете отделить объявление функции от вызова до "click()":

var handler = function() {
  $(this).whatever();
};
$('a.next').click(handler);

Затем, если вы хотите развязать/переоткрыть, вы можете повторить этот вызов "click" и обратиться к функции "обработчик" тем же способом.

Ответ 3

Более простое и короткое решение

(без использования метода bind/unbind)

заключается в том, чтобы добавить класс к объекту, если вы хотите отвязать его, а затем удалить этот класс для повторной проверки ex;

$('#button').click( function(){
   if($(this).hasClass('unbinded')) return;
   //Do somthing
 });

$('#toggle').click(function(){
    $('#button').toggleClass('unbinded');
 });