2011-12-23 15 views
81

ho link come questo:preventDefault all'interno attributo onclick di un tag

<a href="#" onclick="myfunc({a:1, b:'hi'})" />click</a> 
<a href="#" onclick="myfunc({a:3, b:'jo'})" />click</a> 

e vorrei fare un preventDefault() all'interno myfunc, perché verrà aggiunto un # nella barra degli indirizzi quando si fa clic sul link (senza fare return false; o href='javascript:void(0);')

è possibile? posso ottenere l'evento dentro myfunc

+6

Cosa c'è di sbagliato con return false? – Alex

+5

interrompe anche la propagazione – Omu

+4

'return false' interrompe solo la propagazione all'interno di jQuery. – cruzanmo

risposta

112

io credo che si possa passare event nella funzione inline che sarà l'oggetto event per l'evento sollevato nei browser compatibili W3C (vale a dire le vecchie versioni di IE avranno ancora bisogno di rilevamento all'interno della funzione del gestore di eventi per esaminare window.event).

A quick example.

function sayHi(e) { 
 
    e.preventDefault(); 
 
    alert("hi"); 
 
}
<a href="http://google.co.uk" onclick="sayHi(event);">Click to say Hi</a>

  1. Esegui come è e notare che il link non fa reindirizzamento a Google dopo l'avviso.
  2. Quindi, passare event passato nel gestore onclick a qualcos'altro come e, fare clic su Esegui, quindi notare che il reindirizzamento avviene dopo l'avviso (il riquadro dei risultati diventa bianco, dimostrando un reindirizzamento).
+5

ok, vedo tutto quello che dovevo fare è mettere il mio parametro secondo 'myfunc (event, {a: 123, b:" asdas "})' – Omu

+1

@ChuckNorris - sì, è vero. –

+1

@Omu L'argomento passato, l'evento, può essere in qualsiasi posto, non deve essere il primo, a condizione che sia nella posizione corretta dell'elenco dei parametri definiti per la funzione. Ad esempio, 'function myfunc (o, e) {...}', quindi può essere chiamato come 'myfunc ({a: 1, b: 'hi'}, event)'. – cateyes

2

Non puoi semplicemente rimuovere l'attributo href dal tag?

+0

sì, questa è un'opzione anche se, per impostazione predefinita, il collegamento non avrà sottolineato, e se javascript è disattivato non ci sarà href per andare a – Omu

9

Prova questo:

<script> 
    $("a").click(function(event) { 
     event.preventDefault(); 
    }); 
</script> 
+0

questo richiede un tag

4

aggiungere una classe unica per i collegamenti e un javascript che impedisce default su legami con questa classe:

<a href="#" class="prevent-default" 
    onclick="$('.comment .hidden').toggle();">Show comments</a> 

<script> 
    $(document).ready(function(){ 

    $("a.prevent-default").click(function(event) { 
     event.preventDefault(); 
      }); 
    }); 
</script> 
3

Credo che quando usiamo onClick vogliamo fare qualcosa di diverso dal default. Quindi, per tutti i tuoi link con onClick:

$("a[onClick]").on("click", function(e) { 
    return e.preventDefault(); 
}); 
74

La soluzione più semplice è semplicemente:

<a href="#" onclick="event.preventDefault(); myfunc({a:1, b:'hi'});" />click</a> 

In realtà è un buon modo di fare il busting della cache per i documenti con un ripiego per non JS abilitato i browser (senza busting della cache se non JS)

<a onclick=" 
if(event.preventDefault) event.preventDefault(); else event.returnValue = false; 
window.location = 'http://www.domain.com/docs/thingy.pdf?cachebuster=' + 
Math.round(new Date().getTime()/1000);" 
href="http://www.domain.com/docs/thingy.pdf"> 

Se è abilitato JavaScript, si apre il PDF con una stringa di query busting della cache, se non si apre solo il file PDF.

+0

Potrebbe semplicemente utilizzare il server side tech per riscrivere quel link se il busting della cache è tutto ciò che stai cercando. – mpen

+0

Sarebbe meglio, ma non ho accesso al codice lato server. Lavorare con quello che ho. – JuLo

-1

Semplice!

onclick="blabla(); return false" 
Problemi correlati