49 votes

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

J'ai deux fonctions liées à un événement de clic à deux moments différents (avec jQuery). L'ordre dans lequel ils sont renvoyés est significatif. Ils tirent dans le bon ordre. Le problème est que, lorsque la première fonction renvoie false, la seconde fonction est toujours activée!

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!

88voto

Ken Browning Points 15689

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

Empêche l'exécution du reste des gestionnaires. 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');
});
 

2voto

Seb Points 17238

La première chose que je demande est: pourquoi avez-vous deux fonctions liées au même événement de clic? Ayant accès au code, pourquoi ne pas simplement faire ce 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);
    	}
    });
});
 

2voto

Rodrigo Jara Points 21

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

1voto

nickf Points 185423

Est-ce que l'utilisation de unbind aide?

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

0voto

fmsf Points 13399

Si ce que nickf dit ne fonctionne pas, vous pouvez utiliser une petite machine à états:

 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 solution la plus jolie, mais cela fonctionnera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X