Come fare in modo che un tag anchor non faccia riferimento a nulla?


159

Uso jQuery, devo fare in modo che alcuni tag di ancoraggio non eseguano alcuna azione.

Di solito lo scrivo in questo modo:

<a href="#">link</a>

Tuttavia, questo si riferisce alla parte superiore della pagina!


perché jquery gestirà l'evento click quindi voglio che il link sia come un link achor ma si comporti come una funzione JavaScript
ahmed


1
Come menzionato in una delle risposte di seguito: se non si desidera che un collegamento punti a una risorsa, non utilizzare l'elemento A.
Mathias Bynens,

Non utilizzare l' hrefattributo in al suo interno.
vsync,

Risposte:


103

Se non vuoi che punti qualcosa, probabilmente non dovresti usare il <a> tag (anchor).

Se vuoi che qualcosa appaia come un link ma non si comporti come un link, è meglio usare l'elemento appropriato (come <span>) e quindi modellarlo usando CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

Inoltre, dato che hai taggato questa domanda "jQuery", presumo che tu voglia allegare un hander di evento click. In tal caso, fai semplicemente la stessa cosa sopra e usa qualcosa come il seguente JavaScript:

$('#fake-link-1').click(function() {
    /* put your code here */
});

37
Questo ha un problema: non consente la navigazione a schede.

6
Si noti che (come sottolinea Iraimbilanja) l'approccio span qui disabilita la possibilità di invocare la funzione utilizzando la tastiera, che considererei un problema di usabilità.
Fredrik Mörk,

3
Anche un problema di accessibilità. Puoi risolverlo utilizzando un elemento pulsante (generato da JavaScript in modo che gli utenti non JS non ottengano un controllo interrotto).
Quentin,

4
Ecco una soluzione rapida per questo: tabindex = "0" su un elemento non link consentirà la navigazione da tastiera nella maggior parte dei browser moderni.
Mathias Bynens,

1
Un altro "problema" è che non si tratta del CSS: la pseudo classe hover non funzionerà su elementi che non sono collegamenti in IE6. Ma dal momento che stai aggiungendo comunque questi elementi tramite JavaScript (almeno, dovresti), puoi anche scrivere uno script che aggiunge una classe .hover all'elemento quando passa il mouse.
Mathias Bynens,

268

Ci sono alcune soluzioni tutt'altro che perfette:

1. Collegamento a un ancoraggio falso

<a href="#">

Problema: facendo clic sul collegamento si torna alla parte superiore della pagina

2. Utilizzo di un tag diverso da "a"

Utilizzare un tag span e utilizzare jquery per gestire il clic

Problema: interrompe la navigazione della tastiera, è necessario modificare manualmente il cursore al passaggio del mouse

3. Collegamento a una funzione vuota javascript

<a href="javascript:void(0);">
<a href="javascript:;">

Problema: si interrompe durante il collegamento di immagini in Internet Explorer

Soluzione

Poiché tutti questi hanno i loro problemi, la soluzione su cui ho optato è il collegamento a un ancoraggio falso e quindi restituire falso dal metodo onClick:

<a href="#" onClick="return false;">

Non è la soluzione più concisa, ma risolve tutti i problemi con i metodi di cui sopra.


2
Di solito uso javascript: void (0); approccio, perché l'utilizzo di # visualizza l'URL corrente nella barra di Firefox al passaggio del mouse, che può essere fuorviante per l'utente.
lucaferrario,

8
breaks when linking images in IECosa significa questo?
Eugene,

14
@eugene questa domanda ha 3 anni ormai, ma IE faceva sparire le immagini quando era circondato da un collegamento a una funzione vuota. Non sono sicuro quando è stato risolto, ma funziona in IE10, che è tutto ciò che ho installato. Personalmente ora uso<a href="javascript:;">
zaius il

1
Ho usato anche dei commenti: <a href="javascript:void(0); // Mostra la palette delle proprietà">. In questo modo, quando l'utente viene visualizzato, vedono il commento che può dare loro un suggerimento su cosa aspettarsi quando fanno clic. (Anche se potresti usare anche una descrizione comandi.)
Robin Zimmermann,

5
Sembra che href="javascript:"sia anche abbastanza e funziona negli ultimi principali browser. Non è necessario il punto e virgola, infatti PhpStorm suggerisce addirittura di rimuoverlo.
jlh

40

Per fare in modo che non faccia nulla, usa questo:

<a href="javascript:void(0)"> ... </a>

1
o solo <a href="javascript:;">. PS non funziona target=_blankperò
Alex

36

Il modo corretto di gestirlo è "interrompere" il collegamento con jQuery quando si gestisce il collegamento

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

Queste ultime due chiamate interrompono il browser interpretando il clic.


5
Anche se suona come "corretto" perché blocca il gorgoglio degli eventi, "return false" è molto meno prolisso e fa la stessa cosa. L'unica volta che vorresti farlo è se hai già gestori di eventi registrati ai clic sui link tramite jQuery.
aleemb,

25

Ci sono molti modi per farlo come

Non aggiungere e hrefattribuire

<a name="here"> Test <a>

Puoi aggiungere l'evento onclick invece di href like

<a name="here" onclick="YourFunction()"> Test <a>

Oppure puoi aggiungere una funzione nulla come questa, che sarebbe il modo migliore

<a href="javascript:void(0);"> 
<a href="javascript:;">

L'attributo name è obbligatorio?
Petrus Theron,

@PetrusTheron Non necessario. .
Punit Gajjar,

Questa è una fregatura di risposte preesistenti
circa il

1
Non dimenticare di impostare lo stile del tuo tag di ancoraggio se rimuovi l' hrefattributo in quanto non si comporterà più come un collegamento ipertestuale (anche se il clic continua a funzionare) dovrai reimpostare cose come cursor: pointer;e il :hoverselettore.
Partack,

@Partack Corretto .. Grazie per averlo notato
Punit Gajjar il

24

Cosa intendi con niente?

<a href='about:blank'>blank page</a>

o

<a href='whatever' onclick='return false;'>won't navigate</a>

1
D'accordo - restituisci false dal tuo metodo jQuery e voilà, non andrà da nessuna parte
joshcomley,

14

Penso che tu possa provare

<a href="JavaScript:void(0)">link</a>

L'unico problema che vedo qui è che la sicurezza del browser di alto livello potrebbe richiedere l'esecuzione di JavaScript.

Anche se questo è uno dei modi più semplici di

<a href="#" onclick="return false;">Link</a>

questo dovrebbe essere usato con parsimonia

Leggi questo articolo per alcuni suggerimenti https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void


Risposta corretta, consente la navigazione della scheda.
K - La tossicità in SO sta crescendo.

14

Questa risposta dovrebbe essere aggiornata per riflettere i nuovi standard web (HTML5).

Questo:

<a tabindex="0">This represents a placeholder hyperlink</a>

... è HTML5 valido. L'attributo tabindex lo rende focalizzabile sulla tastiera come normali collegamenti ipertestuali. Potresti anche usare l' spanelemento per questo come menzionato in precedenza, ma trovo che usando ila elemento sia più elegante.

Vedi: https://w3c.github.io/html-reference/a.html
e: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href


1
Anche questo è HTML4 valido, ma non modellerà l'ancoraggio come collegamento.
Interjay

1
Non sapevo che fosse html4 valido, ma la specifica HTML5 menziona esplicitamente il caso d'uso. E gli stili che non hanno come target l'attributo href funzioneranno bene, solo gli stili di browser predefiniti potrebbero essere un problema.
aross

1
Anche questo non attiva l' clickevento quando l'utente focalizza l'elemento e preme invio (testato in Firefox 51).
torvin,

@torvin, è semplice. Usa l' keydownevento.
circa il

stravagante stranezza, ma nella finestra 10 aggiunge una casella bordata attorno all'elemento
1-14x0r

12

Ecco i tre modi in cui <a>la hrefproprietà tag del tag non fa riferimento a nulla:

<a href="JavaScript:void(0)"> link </a>

<a href="javascript:;">link</a >

<a href="#" onclick="return false;"> Link </a>

1
Questo è solo un duplicato del momento più alto votato risposta , ma con meno informazioni
aross

5

So che questa è una vecchia domanda, ma ho pensato di aggiungere comunque i miei due centesimi:

Dipende da cosa farà il collegamento, ma di solito, vorrei puntare il collegamento a un URL che potrebbe essere la visualizzazione / fare la stessa cosa, ad esempio, se stai facendo un po 'di pop-up box:

<a id="about" href="/about">About</a>

Quindi con jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

In questo modo, i browser molto vecchi (o i browser con JavaScript disabilitato) possono ancora navigare su una pagina separata, ma, cosa ancora più importante, Google lo prenderà e scansionerà i contenuti della pagina informazioni.


5

Assicurati che tutti i link che vuoi interrompere abbiano href="#!"(o qualsiasi cosa tu voglia, davvero), quindi usa questo:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});

4

Puoi avere un ancoraggio HTML ( atag) senza un hrefattributo. Lascia fuori l' hrefattributo e non si collegherà a nulla:

<a>link</a>

Grazie! Ha funzionato perfettamente per il mio caso. Dove volevo che il tag Anchor si aprisse in una nuova scheda in presenza di URL, ma nulla se non fosse presente un URL. In caso di # stava accettando un CLIC e lo spostava in cima alla pagina. Non avere nessuna parte come suggerito. Ha risolto il problema! La formattazione sembra ottima a causa di un tag, il problema del clic è andato senza href. Grazie!!!
Mohsin,

1
Se qualcun altro sta pensando se è HTML5 valido, la risposta è SÌ :) stackoverflow.com/a/33046203/5323892 . Ecco l'esempio dalla pagina degli standard (vedi la terza voce li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Home </a> </li> <li> <a href = "/ news "> Notizie </a> </li> <li> <a> Esempi </a> </li> <li> <a href="https://stackoverflow.com/legal"> Legale </a> </li> </ ul> </nav>
Mohsin,

Funziona ma se vuoi che il puntatore del mouse cambi in dito, aggiungi semplicemente href = "JavaScript: void (0)" come suggerito nella risposta di @Rutesh Makhijani.
Tarik,

3

L'unica cosa che ha funzionato per me è stata una combinazione di quanto sopra:

Prima il li nell'ul

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

Quindi in LoadTab2_1 ho cambiato manualmente le div della scheda

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

Questo perché la disconnessione dell'elemento disconnette anche l'azione nelle schede

È inoltre necessario eseguire manualmente lo stile della scheda quando la scheda principale cambia le cose

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");


1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

questo era il mio tag di ancoraggio. quindi restituire false su onClick = "" l'evento non è utile qui. Ho appena rimosso la proprietà href = "#" e ha funzionato per me proprio come sotto

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

e ho dovuto aggiungere questo css.

.SomeClass
{
    cursor: pointer;
}

Cosa intendi con quello. Cosa è raccomandato e perché?
Burk,

La sua buona pratica per mantenere javascript e html in file separati, ecco una risposta dettagliata: stackoverflow.com/questions/5871640/…
Alexandru Severin,

1

Ho riscontrato questo problema su un sito WordPress. Le intestazioni nei menu a discesa avevano sempre l'attributo href=""e il plug-in di intestazione utilizzato consentiva solo gli URL standard. La soluzione più semplice c'era solo per eseguire questo codice nel piè di pagina:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

Ciò impedirà alle ancore in bianco di fare qualsiasi cosa.


0

React non supporta più l'utilizzo di una funzione come questa href="javascript:void(0)"nel tag di ancoraggio, ma qui c'è qualcosa che funziona abbastanza bene.

<a href="#" onClick={() => null} >link</a>

-1

So che questo è etichettato come una domanda jQuery, ma puoi rispondere anche con AngularJS.

nel tuo elemento, aggiungi la direttiva ng-click e usa la variabile $ event che è l'evento click ... impedisci il suo comportamento predefinito:

<a href="#" ng-click="$event.preventDefault()">

Puoi anche passare la variabile $ event in una funzione:

<a href="#" ng-click="doSomething($event)">

in quella funzione, fai quello che vuoi con l'evento click.

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.