web-dev-qa-db-fra.com

Gestionnaires d'événements multiples jQuery - Comment annuler?

J'ai deux fonctions liées à un événement de clic à deux moments différents (en utilisant jQuery). L'ordre dans lequel ils sont tirés est important. Ils tirent dans le bon ordre. Le problème est que lorsque la première fonction retourne false, la deuxième fonction est toujours en cours de déclenchement!

Comment puis-je annuler correctement l'événement?

Exemple de code:

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

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

Vous verrez toujours le message d'alerte "b" lorsque vous cliquez sur la page. C'est inacceptable!

44
Josh Stodola

Utilisez la fonction stopImmediatePropagation de l'objet d'événement jQuery.

Empêche le reste des gestionnaires d'être exécutés. Cette méthode arrête également le bouillonnement en appelant event.stopPropagation ().

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

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

Merci, unbind fonctionne pour redéfinir les fonctions.

  $(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
Rodrigo Jara

La première chose que je demande est: pourquoi avez-vous des fonctions deux liées au même événement de clic? Ayant accès au code, pourquoi ne faites-vous pas qu'un seul appel?

$(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);
        }
    });
});
2
Seb

Est-ce que l'aide de la dissociation aide?

$(document).click(function() { 
  alert('a');
  $(this).unbind('click');
  return false;
});
1
nickf

Si ce que nickf a dit ne fonctionne pas, vous pouvez utiliser une petite machine d'état:

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;
});

Pas la plus jolie solution, mais ça marchera.

0
fmsf