2012-02-17 11 views
10

Estoy usando event.stopPropagation() en mi aplicación. Sin embargo, ha aparecido un escenario en el que quiero que la propagación continúe como si nunca se hubiera llamado a la función antes mencionada. Entonces me estoy preguntando; ¿hay alguna forma de "reanudar" la propagación después de haber sido detenida? Sería terriblemente tedioso mover la única llamada al event.stopPropagation a una docena de declaraciones condicionales separadas.Cómo deshacer event.stopPropagation en jQuery?

+0

Mmmm ... http: //stackoverflow.com/questions/4735006/javascript-how-to-enable-stoppropagation – elclanrs

+0

Si existiera tal facilidad, ¿no necesitaría una docena de declaraciones condicionales para decidir si debería? invocarlo? – Jon

+0

Ellos ya están allí. Habría una llamada a 'event.stopPropagation()' y (raramente) una llamada al hipotético 'event.resumePropagation()'. Eso sería preferible a llamar a 'event.stopPropagation()' en todos los condicionales excepto uno – Hubro

Respuesta

14

Una vez que la propagación se ha detenido, no se puede reanudar. Como solución, lo que puede hacer es establecer una variable, y sólo se detiene si esta variable es cierto:

var stop = false; 
// do your logic here 
if(stop){ 
    event.stopPropagation(); 
} 
+3

No pensé en eso. Eso es mucho más limpio que mi solución de respaldo. Sería óptimo si pudieras editar tu respuesta e incluir el hecho de que "una vez que se detuvo la propagación, ** no puede" reanudarse " – Hubro

+0

¡Solo lo he editado! – Schiavini

2

Ponga la llamada event.stopPropagation() dentro de su condición. Por ejemplo

$el.click(function(event) { 
    if (some_condition) { 
     event.stopPropagation() 
     // do stuff 
    } 
    else { 
     // do other stuff, without stopping propagation 
    } 
}); 

Tedious puede ser, pero desafortunadamente stopPropagation es un interruptor de una sola dirección. Una vez detenido, no puede volver a encenderlo para el mismo evento.

+0

No es una condición "a". Es un ** lote ** de condiciones. Citando a mí mismo: "Sería terriblemente tedioso mover una llamada a event.stopPropagation a una docena de sentencias condicionales separadas" – Hubro

+0

Es tedioso, pero desafortunadamente 'stopPropagation' es un cambio de una sola dirección. Una vez detenido, no puede volver a encenderlo para el mismo evento. –

+0

Ahora ** esa ** es la respuesta que estaba buscando. Como eso realmente responde mi pregunta, lo aceptaré si edita – Hubro

2

Sólo refactorizar el evento original como esto:

var refEvent = event.originalEvent; 
refEvent.cancelBubble = false; 
refEvent.defaultPrevented = false; 
refEvent.returnValue = true; 
refEvent.timeStamp = (new Date()).getTime(); 

if (event.target.dispatchEvent){ 
    event.target.dispatchEvent(refEvent); 
} else if (event.target.fireEvent) { 
    event.target.fireEvent(refEvent); 
} 
+4

¿Puede proporcionar un ejemplo de funcionamiento de un evento detenido con e.stopPropagation() y luego reiniciarlo con su ejemplo anterior? No pude hacer que funcionara, pero se ve bien en teoría. – gfullam

0

Aquí es una solución que funciona:

$('#mydiv').on('click.new', function(e){ 

    e.stopImmediatePropagation(); 

alert('this will happen only once'); 

$('#mydiv').unbind('click.new'); 

}); 

Hace uso del hecho de que el evento puede tener un espacio de nombres personalizado, y puede desvincularse en consecuencia. También funciona para e.stopPropagation. Para el caso, puede deshacer cualquier cosa asociada con ese evento de clic personalizado.