JQuery перестать вызывать другой обработчик - PullRequest
8 голосов
/ 29 ноября 2011

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

$('#l1').bind('click',function(){
 alert('label clicked');
}
$('#l2').bind('click',function(){
 alert('label2 clicked');
}
$('#l3').bind('click',function(){
 alert('label3 clicked');
}

$('label').bind('click',function(){
 if($(this).hasClass('disabled')
return false
}
<label id='l1'>hi</label>
<label id='l2' class="disabled">bye</label>
<label id='l3'>hi</label>

Теперь я не хочу, чтобы предупреждение отображалось при нажатии на ярлык с классом disabled. Возможно ли это сделать?

Примечание: alert это просто глупость ... Я выполняю набор действий вместо этого ... каждый из которых отличается от фактического ярлыка

1 Ответ

22 голосов
/ 29 ноября 2011

Если несколько обработчиков событий связаны с одним и тем же элементом для одного и того же события, обработчики вызываются в том порядке, в котором они были связаны. Если вы вызовете event.stopImmediatePropagation() в определенном обработчике, это остановит последующие вызовы обработчиков.

Итак, измените ваш $('label').bind() следующим образом:

$('label').bind('click',function(event){
   if($(this).hasClass('disabled') {
      event.stopImmediatePropagation();
      return false;
   }
}

и переместите это выше ваших других .bind() вызовов. Затем этот конкретный обработчик будет выполняться первым и сможет предотвратить выполнение других обработчиков.

(Обратите внимание, что .stopImmediatePropagation() не совпадает с .stopPropagation()] - последний останавливает событие, всплывающее в DOM-дереве, но не останавливает другие обработчики на тот же элемент.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...