2011-11-14 13 views
29

Si adjunta dos o más controladores de eventos a un elemento HTML, se ejecutarán uno después del otro. Sin embargo, si desea detener los controladores de eventos posteriores, en función de una condición marcada en el primer controlador, ¿qué debe hacer?Cómo prevenir otros controladores de eventos, desde el primer controlador, en jQuery

Por ejemplo:

<div id='target'> 
</div> 

<p id='result'> 
</p> 

Me gustaría cancelar el segundo controlador, si el primer controlador se cancela.

$(function() { 
    var target = $('#target'), 
     result = $('#result'); 
    target.click(function(e) { 
     result.append('first handler<br />'); 
     // Here I want to cancel all subsequent event handlers 
    }); 
    target.click(function(e) { 
     result.append('second handler<br />'); 
    }); 
}); 

Puedes ver el violín here.

PD: Sé que e.preventDefault() impide la acción predeterminada del elemento HTML (por ejemplo, evitar que se envíe una solicitud HTTP GET debido al clic en un enlace) y e.preventPropagation() hace que el evento se propague a sus elementos principales en el árbol DOM. También sé que es posible usar una variable del medio, establecerla en verdadero en el administrador de primera mano y verificarla en los controladores posteriores. Pero quiero ver si hay una solución más clara y sofisticada para este problema o no.

Respuesta

43

Ver event.stopImmediatePropagation()-http://api.jquery.com/event.stopImmediatePropagation/

De acuerdo con los documentos de la API jQuery, este método:

queda con el resto de los manipuladores de ser ejecutado e impide el evento desde burbujeando el árbol DOM.

+0

He actualizado el [violín] (http://jsfiddle.net/saeedneamati/pFp7P/2/) para reflejar su respuesta. +1 y gracias. –

1

La solución es específica del navegador. Ver dojo.stopEvent:

dojo.stopEvent = function(/*Event*/ evt){ 
    // summary: 
    //  prevents propagation and clobbers the default action of the 
    //  passed event 
    // evt: Event 
    //  The event object. If omitted, window.event is used on IE. 
    if(has("dom-addeventlistener") || (evt && evt.preventDefault)){ 
     evt.preventDefault(); 
     evt.stopPropagation(); 
    }else{ 
     evt = evt || window.event; 
     evt.cancelBubble = true; 
     on._preventDefault.call(evt); 
    } 
}; 

violín Actualizado: http://jsfiddle.net/pFp7P/1/

+0

Esta pregunta se relaciona con jQuery – Bill

+0

Esta es una solución nativa; ¿Ya no funciona con jQuery? – fncomp

Cuestiones relacionadas