Evento di accesso per chiamare preventdefault dalla funzione personalizzata originata dall'attributo onclick del tag


119

Ho collegamenti come questo:

<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()interno myfunc(), perché #verrà aggiunto un nella barra degli indirizzi quando si fa clic sul collegamento (senza fare return false;o href='javascript:void(0);')

È possibile? Posso avere l'evento all'internomyfunc()


6
Cosa c'è di sbagliato in return false?
Alex

5
ferma anche la propagazione
Omu

4
return falseferma solo la propagazione all'interno di jQuery.
cruzanmo

Risposte:


157

Credo che tu possa passare eventalla funzione inline che sarà l' eventoggetto per l'evento generato nei browser compatibili con W3C (cioè le versioni precedenti di IE richiederanno ancora il rilevamento all'interno della funzione del gestore di eventi per essere esaminate window.event).

Un rapido esempio .

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

  1. Eseguilo così com'è e nota che il link non reindirizza a Google dopo l'avviso.
  2. Quindi, modifica il eventpassaggio nel onclickgestore in qualcos'altro come e, fai clic su Esegui, quindi nota che il reindirizzamento avviene dopo l'avviso (il riquadro dei risultati diventa bianco, dimostrando un reindirizzamento).

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

1
@Omu L'argomento passato, evento, può trovarsi in qualsiasi posizione, non è necessario che sia il primo, purché sia ​​al posto giusto dell'elenco di parametri definito per la funzione. Ad esempio, function myfunc(o, e) {...}allora può essere chiamato come myfunc({a:1, b:'hi'}, event).
cateyes

2
Penso che non sia necessario passare e acquisire esplicitamente l'oggetto evento. Puoi semplicemente fare riferimento ad esso nella funzione. Qualcuno può confermare? Voglio dire, questo codice senza l'evento dovrebbe funzionare anche:function sayHi() { event.preventDefault(); alert("hi"); }
K Vij

111

La soluzione più semplice è semplicemente:

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

In realtà è un buon modo per eseguire il busting della cache per i documenti con un fallback per i browser non abilitati per JS (nessun 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 JavaScript è abilitato, apre il PDF con una stringa di query di busting della cache, in caso contrario apre semplicemente il PDF.


Potrebbe semplicemente usare la tecnologia lato server per riscrivere quel link se il busting della cache è tutto ciò che cerchi.
mpen

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

11

Prova questo:

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

ciò richiede un tag <script> per ogni evento di clic che rende il codice più complicato.
somid3

Richiede anche jQuery, che sebbene possa essere presente non dovrebbe essere un prerequisito.
Capannone irregolare il

Anche qui non sono d'accordo, una semplice analisi di una funzione inline è più efficace e meno codice.
Shannon Hochkins

1
@ somid3, mentre jQuery non è necessaria , se siete preoccupati per le prestazioni, è possibile utilizzare un unico gestore di eventi delegato modo che si sta collegando un solo listener per tutte le ancore nella pagina come questa: $("body").on("click","a",function(e) { e.preventDefault() });. In entrambi i casi, nessuna delle due soluzioni avrà un impatto significativo sulle prestazioni.
KyleMit

7
<script type="text/javascript">
$('a').click(function(){
   return false;
});
<script>

2
Questo vale per ogni ancoraggio e interromperà tutti i collegamenti, richiede anche l'inserimento di javascript nella pagina e jQuery.
Shannon Hochkins

Inoltre, quando si utilizza jQuery, return falsenon è consigliabile in quanto impedirà anche l'esecuzione di tutti gli altri gestori di eventi su quell'elemento e impedirà all'evento di ribollire agli elementi superiori.
Stijn de Witt

6

Aggiungi una classe univoca ai collegamenti e un javascript che impedisce l'impostazione predefinita sui collegamenti 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>

Approccio interessante per una soluzione globale.
AFract

5

Non puoi semplicemente rimuovere l'attributo href dal tag a?


1
sì, anche questa è un'opzione, anche se per impostazione predefinita il collegamento non avrà la sottolineatura e se javascript è disattivato non ci sarà href a cui accedere
Omu

4

Penso che quando usiamo onClick vogliamo fare qualcosa di diverso da quello predefinito. Quindi, per tutti i tuoi collegamenti con onClick:

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

2

Semplice!

onclick="blabla(); return false"

2

Puoi accedere all'evento da un clic in questo modo:

<button onclick="yourFunc(event);">go</button>

e alla tua funzione javascript, il mio consiglio è di aggiungere quella prima riga di istruzione come:

function yourFunc(e) {
    e = e ? e : event;
}

quindi usa ovunque e come variabile evento



0

Senza alcuna libreria JS o jQuery. Per aprire una bella finestra popup, se possibile. Non riesce in modo sicuro al collegamento normale aperto.

<a href="https://acme.com/" onclick="onclick="openNewWindow(event, this.href);">...</a>

E la funzione di supporto:

function openNewWindow(event, location) {
  if (event.preventDefault && event.stopImmediatePropagation) { 
    event.preventDefault(); 
    event.stopImmediatePropagation(); 
  } else {
    event.returnValue = false; 
  }
  window.open(location, 'targetWindow', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=800,height=450');
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.