Как мне «перепривязать» событие click после отмены привязки («click»)? - PullRequest
13 голосов
/ 07 апреля 2010

У меня есть якорный тег <a class="next">next</a>, превращенный в «кнопку». Иногда этот тег необходимо скрыть, если нет ничего нового для показа. Все работает нормально, если я просто скрываю кнопку с помощью .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');
}

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

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

Ответы [ 3 ]

15 голосов
/ 07 апреля 2010

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

$('a.next').click(function() {
    if (!$(this).is(":animated")) {
        // do stuff
    }
});
6 голосов
/ 07 апреля 2010

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

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

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

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

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

2 голосов
/ 08 января 2016

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

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

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

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

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