2010-04-07 13 views
13

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

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь нажимает кнопку во время анимации 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 на самом деле не достаточно проста для понимания.

ответ

15

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

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

Спасибо nickf, Это сработало отлично. Но мне все еще интересно, как я «перепроверяю» событие click, если кто-то знает. – Ben

6

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

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

При настройке «нажмите кнопку» обработчик, в первую очередь, вы можете отделить объявление функции от вызова «нажмите()»:

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

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

+0

Я понимаю, что вы говорите, но я не знаю, как перевести его в код. Функция, которую я хочу выполнить, - это именно то, что раньше было кликом(). Как это сделать? – Ben

+0

Ну как же «щелкнуть» получить в первую очередь (до того, как вы назовете «развязать»)? О, подождите, я вижу - это * * обработчик кликов. ОК, держись, и я отредактирую свой ответ. – Pointy

+0

Думаю, я понял, о чем вы говорите.В вашем примере выше «обработчик» - это функция, и я, хотя при вызове функции вам нужны открывающиеся и закрывающиеся круглые скобки(). – Ben

2

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

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

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

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

$('#toggle').click(function(){ 
    $('#button').toggleClass('unbinded'); 
}); 
Смежные вопросы