Ответ 1
Я бы просто добавил чек, чтобы увидеть, анимирует ли он сначала:
$('a.next').click(function() {
if (!$(this).is(":animated")) {
// do stuff
}
});
У меня есть якорный тег <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 на самом деле не достаточно проста для понимания.
Я бы просто добавил чек, чтобы увидеть, анимирует ли он сначала:
$('a.next').click(function() {
if (!$(this).is(":animated")) {
// do stuff
}
});
Когда вы перепроверяете событие click, вы начинаете все заново. Вам необходимо предоставить функцию, которую вы собираетесь обрабатывать событиями. jQuery не помнит их для вас после вызова "unbind".
В этом конкретном случае это немного сложнее. Проблема в том, что при запуске этих анимаций вы настраиваете в действие ряд действий, которые управляются таймером. Таким образом, отключение и переупорядочение обработчика "click" внутри самого обработчика кликов действительно ничего не поможет. Что помогло бы (при условии, что вы не хотите решить проблему с трюком is(":animated")
), было бы отвязать обработчик, а затем перестроить обратный вызов "завершить" из вашей анимации.
Когда вы сначала настроите обработчик "click", вы можете отделить объявление функции от вызова до "click()":
var handler = function() {
$(this).whatever();
};
$('a.next').click(handler);
Затем, если вы хотите развязать/переоткрыть, вы можете повторить этот вызов "click" и обратиться к функции "обработчик" тем же способом.
Более простое и короткое решение
(без использования метода bind/unbind)
заключается в том, чтобы добавить класс к объекту, если вы хотите отвязать его, а затем удалить этот класс для повторной проверки ex;
$('#button').click( function(){
if($(this).hasClass('unbinded')) return;
//Do somthing
});
$('#toggle').click(function(){
$('#button').toggleClass('unbinded');
});