2012-05-03 13 views
10

Quando uso event.preventDefault() su un collegamento funziona, tuttavia quando lo uso su un pulsante no!
DEMO
il mio codice:preventDefault() non funziona

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

azione di collegamento è stato annullato, ma quando clicco sul pulsante, esegue ancora l'azione onClick
Qualsiasi aiuto? quello che voglio fare è quello di evitare che il pulsante onClick azione senza cambiare il pulsante HTML (io so come fare

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

+0

Non aggiungere eventi utilizzando gli attributi html in linea. Utilizzare la registrazione dell'evento corretta. –

+0

Non sto aggiungendo nulla, l'HTML è generato dal Framework, Magento se lo vuoi sapere .. – skafandri

+1

Perché non vuoi usare removeAttr ('onClick')? –

risposta

21

Volete event.stopImmediatePropagation(); se ci sono più gestori di eventi su un elemento e si desidera preventDefault() blocca solo l'azione predefinita (ad esempio l'invio di un modulo o la navigazione verso un altro URL) mentre stopImmediatePropagation() impedisce all'evento di ribollire l'albero DOM e impedisce l'esecuzione di qualsiasi altro gestore di eventi sullo stesso elemento

Ecco alcuni link utili che spiegano i vari metodi:

Tuttavia, dal momento che ancora non funziona significa che il gestore onclick="" eseguito prima il gestore eventi allegato. Non c'è niente che tu possa fare da quando il codice è stato eseguito, il codice onclick è già stato eseguito.

La soluzione più semplice è la rimozione del tutto tale gestore:

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

Anche l'aggiunta di un listener di eventi tramite javascript pianura (addEventListener()) con useCapture=true non aiuta - a quanto pare gli eventi in linea innescano anche prima dell'inizio della manifestazione scendendo la DOM albero.

Se proprio non si vuole rimuovere il gestore perché ne hai bisogno, semplicemente convertirlo in un evento collegato correttamente:

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

non funziona! http://jsfiddle.net/46sbB/1/ – skafandri

+0

le 6 persone che hanno messo in svantaggio questa risposta possono dirmi perché non funziona ???? – skafandri

+0

Ho aggiornato la mia risposta – ThiefMaster

2

si può provare questo:

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

DEMO

2

La funzione preventDefault non si ferma gestori di eventi da non attivare, ma piuttosto arresta il che si svolgono azione di default. Per i collegamenti, interrompe la navigazione, per i pulsanti, impedisce la presentazione del modulo, ecc.

Quello che stai cercando è stopImmediatePropagation.

+0

non funziona! Http://jsfiddle.net/46sbB/1/ – skafandri

+0

Ah ... Non hai alcun controllo sugli altri gestori di eventi registrati sullo stesso elemento. Ciò che puoi fare è prevenire l'evento spumeggiante Mi dispiace aver frainteso la tua domanda. –

Problemi correlati