test - jQuery Controladores de eventos múltiples: ¿cómo cancelar?
sistema de votacion en php y mysql (5)
¿Usar ayuda para desvincular?
$(document).click(function() {
alert(''a'');
$(this).unbind(''click'');
return false;
});
Tengo dos funciones vinculadas a un evento de clic en dos momentos diferentes (usando jQuery). El orden en el que son despedidos es significativo. Están disparando en el orden correcto. El problema es que, cuando la primera función devuelve falso, ¡la segunda función sigue disparando!
¿Cómo puedo cancelar el evento correctamente?
Código de ejemplo:
$(document).click(function() {
alert(''a'');
return false;
});
$(document).click(function() {
alert(''b'');
});
Todavía verá el mensaje de alerta "b" al hacer clic en la página. ¡Esto es inaceptable!
Lo primero que pregunto es: ¿por qué tiene dos funciones vinculadas al mismo evento de clic? Al tener acceso al código, ¿por qué no haces esa sola llamada?
$(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);
}
});
});
Use la función stopImmediatePropagation
del objeto de evento jQuery.
Evita que se ejecute el resto de los controladores. Este método también detiene el burbujeo llamando a event.stopPropagation ().
$(document).click(function(event) {
alert(''a'');
event.stopImmediatePropagation();
return false;
});
$(document).click(function() {
alert(''b'');
});
Si lo que dice nick no funciona, podría usar una pequeña máquina de estado:
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;
});
No es la solución más bonita, pero funcionará.
Gracias, Desvincular funciona para redefinir funciones.
$(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''); });
}
}
})