jQuery несколько обработчиков событий - как отменить? - PullRequest
44 голосов
/ 17 марта 2009

У меня есть две функции, связанные с событием щелчка в два разных времени (используя jQuery). Порядок, в котором они уволены, имеет большое значение. Они стреляют в правильном порядке. Проблема в том, что когда первая функция возвращает false, вторая функция все еще работает!

Как правильно отменить мероприятие?

Пример кода:

$(document).click(function() { 
  alert('a');
  return false;
});

$(document).click(function() {
  alert('b');
});

Вы все равно увидите предупреждение "b" при нажатии на страницу. Это недопустимо!

Ответы [ 5 ]

85 голосов
/ 17 марта 2009

Используйте функцию stopImmediatePropagation объекта события jQuery.

Сохраняет остальные обработчики от выполнения. Этот метод также останавливает всплывание, вызывая event.stopPropagation ().

$(document).click(function(event) { 
  alert('a');
  event.stopImmediatePropagation();
  return false;
});

$(document).click(function() {
  alert('b');
});
2 голосов
/ 04 марта 2011

Спасибо, unbind работает для переопределения функций.

  $(document).ready(function(){
        $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
   });
$(".tipo").live('click',function(){
            if($(this).attr('checked')!=''){
                if($(this).val()=='libro'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){  window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); });
                }else if($(this).val()=='otra'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500');  });
                }
            }
        })
2 голосов
/ 17 марта 2009

Первое, что я спрашиваю: почему у вас две функции, связанные с одним и тем же событием щелчка? Имея доступ к коду, почему бы вам просто не сделать этот единственный звонок?

$(function (){
    var callbackOne = function(e){
        alert("I'm the first callback... Warning, I might return false!");
        return false;
    };

    var callbackTwo = function(e){
        alert("I'm the second callback");
    };

    $(document).click(function (e){
        if(callbackOne(e)){
            callbackTwo(e);
        }
    });
});
1 голос
/ 17 марта 2009

Помогает ли использование unbind?

$(document).click(function() { 
  alert('a');
  $(this).unbind('click');
  return false;
});
0 голосов
/ 17 марта 2009

Если то, что сказал Никф, не работает, вы можете использовать небольшой конечный автомат:

var trigger = 0;

$(document).click(function() { 

  alert('a');
  if(you_want_to_return_false) {
    trigger = 1;
    return false;
  }
});

$(document).click(function() {
  if(trigger !== 0) {
  alert('b');
  } 
  trigger = 0;
});

Не самое красивое решение, но оно будет работать.

...