2012-05-03 33 views
10

Cuando uso event.preventDefault() en un enlace funciona, ¡pero cuando lo uso en un botón no funciona!
DEMO
mi código:preventDefault() no funciona

<a id="link" href="http://www.google.com">link</a> 
<button id="button" onclick="alert('an alert')">button</button>​ 

$('#link').click(function(event){ 
    event.preventDefault(); 
}); 
$('#button').click(function(event){ 
    event.preventDefault(); 
}); 

Enlace de acción se cancela, pero cuando hago clic en el botón, todavía ejecuta la acción onClick
Cualquier ayuda? lo que yo quiero hacer es evitar que el botón onClick acción sin cambiar el botón html (sé cómo hacer

$('#button').removeAttr('onclick');

+0

No agregue eventos utilizando los atributos html en línea. Use el registro de evento apropiado. –

+0

No estoy agregando nada, el HTML es generado por el Framework, Magento si quieres saber ... – skafandri

+1

¿Por qué no quieres usar removeAttr ('onClick')? –

Respuesta

21

¿Quieres event.stopImmediatePropagation(); si hay varios controladores de eventos en un elemento y desea evitar que los demás ejecuten. preventDefault() simplemente bloquea la acción predeterminada (como enviar un formulario o navegar a otra URL) mientras stopImmediatePropagation() evita que el evento burbujee el árbol DOM y impide que se ejecute cualquier otro controlador de eventos en el mismo elemento

Éstos son algunos enlaces útiles que explican los diferentes métodos:

Sin embargo, puesto que todavía no funciona, significa que el controlador ejecuta antes onclick="" el controlador de eventos adjunto. No hay nada que pueda hacer, ya que cuando se ejecuta el código, el código onclick ya se ha ejecutado.

La solución más fácil es eliminar por completo ese manejador:

$('#button').removeAttr('onclick'); 

Incluso la adición de un detector de eventos a través de JavaScript simple (addEventListener()) con useCapture=true no ayuda - al parecer acontecimientos desencadenan en línea, incluso antes de que comience el evento descendiendo el DOM árbol.

Si simplemente no se desea eliminar el controlador porque lo necesita, sólo tiene que convertirlo en un evento adecuadamente adjunto:

var onclickFunc = new Function($('#button').attr('onclick')); 
$('#button').click(function(event){ 
    if(confirm('prevent onclick event?')) { 
     event.stopImmediatePropagation(); 
    } 
}).click(onclickFunc).removeAttr('onclick'); 
+0

no funciona! http://jsfiddle.net/46sbB/1/ – skafandri

+0

¿pueden las 6 personas que votaron a favor esta respuesta decirme por qué no funciona? – skafandri

+0

He actualizado mi respuesta – ThiefMaster

2

puede probar esto:

$('#button').show(function() { 
    var clickEvent = new Function($(this).attr('click')); // store it for future use 
    this.onclick = undefined; 
}); 

DEMO

2

La función preventDefault no impide que los controladores de eventos se dispare, sino más bien detiene el que tiene lugar la acción por defecto. Para los enlaces, detiene la navegación, para los botones, impide que se envíe el formulario, etc.

Lo que usted está buscando es stopImmediatePropagation.

+0

no funciona! Http://jsfiddle.net/46sbB/1/ – skafandri

+0

Ah ... Realmente no tiene ningún control sobre otros controladores de eventos registrados en el mismo elemento. Lo que puede hacer es evitar un evento burbujeo. Siento haber malinterpretado su pregunta. –