Quale valore "href" dovrei usare per i link JavaScript, "#" o "javascript: void (0)"?


4076

Di seguito sono due metodi per creare un collegamento che ha il solo scopo di eseguire il codice JavaScript. Qual è il migliore, in termini di funzionalità, velocità di caricamento della pagina, scopi di convalida, ecc.?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

o

function myJsFunc() {
    alert("myJsFunc");
}
 <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>


202
A meno che non mi manchi qualcosa, non <a href="javascript:void(0)" onclick="myJsFunc();">ha assolutamente senso. Se è necessario utilizzare il javascript:protocollo psuedo, non è necessario anche l' onclickattributo. <a href="javascript:myJsFunc();">andrà bene.
Wesley Murch,

65
@WesleyMurch - Se myJsFunc()ha un valore di ritorno, la tua pagina si interromperà. jsfiddle.net/jAd9G saresti ancora necessario utilizzare voidin questo modo: <a href="javascript:void myJsFunc();">. Ma poi, il comportamento sarebbe comunque diverso. Il richiamo del collegamento tramite il menu contestuale non attiva l' clickevento.
gilly3

38
Perché non solo <a href="javascript:;" onclick="myEvent()"?
3k

26
javascript:;è molto più veloce da digitare rispetto ajavascript:void(0)
Mike Causer,

78
Pensato per primo a questo: "perché dovresti usare un <a>tag se quello che vuoi fare è NON aprire un'altra pagina tramite la funzionalità del browser nativo ma piuttosto avere qualche 'azione' javascript da attivare? Semplicemente usando un spantag con una classe di js-triggerprobabilmente molto meglio ". Oppure mi sfugge qualcosa?
Adrien,

Risposte:


2164

Io uso javascript:void(0).

Tre ragioni. Incoraggiare l'uso di #un team di sviluppatori porta inevitabilmente ad usare il valore di ritorno della funzione chiamata così:

function doSomething() {
    //Some code
    return false;
}

Ma poi dimenticano di usare return doSomething()l'onclick e semplicemente usano doSomething().

Un secondo motivo per evitare #è che il finale return false;non verrà eseguito se la funzione chiamata genera un errore. Quindi gli sviluppatori devono anche ricordare di gestire in modo appropriato qualsiasi errore nella funzione chiamata.

Un terzo motivo è che ci sono casi in cui la onclickproprietà dell'evento è assegnata in modo dinamico. Preferisco essere in grado di chiamare una funzione o assegnarla in modo dinamico senza dover codificare la funzione specificamente per un metodo di allegato o un altro. Quindi il mio onclick(o su qualsiasi cosa) nel markup HTML assomiglia a questo:

onclick="someFunc.call(this)"

O

onclick="someFunc.apply(this, arguments)"

L'uso javascript:void(0)evita tutti i suddetti mal di testa e non ho trovato alcun esempio di un aspetto negativo.

Quindi, se sei uno sviluppatore solitario, puoi chiaramente fare la tua scelta, ma se lavori in gruppo devi dichiarare:

Utilizzare href="#", assicurarsi che onclickcontenga sempre return false;alla fine, che qualsiasi funzione chiamata non generi un errore e se si collega una funzione dinamicamente alla onclickproprietà, assicurarsi che oltre a non generare un errore ritorni false.

O

Uso href="javascript:void(0)"

Il secondo è chiaramente molto più facile da comunicare.


329
Apro sempre ogni link in una nuova scheda e questo è il motivo per cui lo odio personalmente quando le persone usano il href="javascript:void(0)"metodo
Timo Huovinen,

182
Mi dispiace non essere d'accordo, perché questa risposta ha così tanti voti positivi? Qualsiasi uso javascript:deve essere considerato una cattiva pratica, invadente e non declassato con grazia.
Lankymart,

52
Le prossime due risposte sono molto migliori e ragionevoli di questa. Inoltre, i primi due argomenti non sono validi perché event.preventDefault()è proprio lì per impedire il comportamento predefinito (come saltare in cima alla pagina in questo caso) e fare un lavoro migliore senza la return false;follia.
sudee,

136
Avanzamento rapido al 2013: javascript:void(0)viola le norme sulla sicurezza dei contenuti nelle pagine HTTPS abilitate per CSP. Un'opzione sarebbe quindi usare href='#'e event.preventDefault()nel gestore, ma non mi piace così tanto. Forse puoi stabilire una convenzione da usare href='#void'e assicurarti che nessun elemento della pagina abbia id="void". In questo modo, facendo clic su un collegamento all'ancoraggio inesistente non si scorre la pagina.
jakub.g

24
È possibile utilizzare "#" e quindi associare un evento clic a tutti i collegamenti con "#" come href. Questo sarebbe fatto in jQuery con:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Nathan,

1325

Nessuno dei due.

Se puoi avere un URL reale che ha senso usalo come HREF. Il clic non si attiva se qualcuno fa clic con il pulsante centrale sul tuo link per aprire una nuova scheda o se JavaScript è disabilitato.

Se ciò non è possibile, allora almeno iniettare il tag anchor nel documento con JavaScript e i gestori di eventi click appropriati.

Mi rendo conto che ciò non è sempre possibile, ma a mio avviso dovrebbe essere cercato di sviluppare qualsiasi sito Web pubblico.

Dai un'occhiata a JavaScript discreto e al miglioramento progressivo (entrambi Wikipedia).


19
Puoi fare un esempio di come si potrebbe "iniettare il tag anchor nel documento con JavaScript e i gestori di eventi click appropriati"?
user456584,

11
Perché iniettare del tutto il tag di ancoraggio se si intende semplicemente usarlo per consentire a un elemento di essere a) cliccato b) visualizzare il cursore "puntatore". Sembra irrilevante persino iniettare un tag di ancoraggio in questo scenario.
cotta

12
+1 per nessuno dei due, ma ci sono approcci eccessivi. Il fatto rimane un uso di una javascript:o #entrambe le cattive pratiche e non deve essere incoraggiato. Bei articoli tra l'altro.
Lankymart,

13
@crush: Nemmeno io userei un div o una span; francamente, sembra che la cosa sia <button>stata pensata per questo. Ma d'accordo: probabilmente non dovrebbe essere specificamente un <a>se non c'è un posto adatto per collegarlo.
cHao,

14
@cHao Button è forse la scelta migliore. Suppongo che il punto principale sia che l'elemento HTML non dovrebbe essere selezionato in base al suo aspetto di presentazione predefinito, ma piuttosto al suo significato per la struttura del documento.
schiaccia il

775

Fare <a href="#" onclick="myJsFunc();">Link</a>o <a href="javascript:void(0)" onclick="myJsFunc();">Link</a>qualsiasi altra cosa che contenga un onclickattributo - andava bene cinque anni fa, anche se ora può essere una cattiva pratica. Ecco perché:

  1. Promuove la pratica del JavaScript invadente - che si è rivelato difficile da mantenere e difficile da ridimensionare. Maggiori informazioni su questo in JavaScript discreto .

  2. Stai spendendo il tuo tempo a scrivere un codice incredibilmente dettagliato, che ha pochissimi (se del caso) vantaggi per la tua base di codice.

  3. Ora ci sono modi migliori, più facili e più gestibili e scalabili per ottenere il risultato desiderato.

Il modo discreto di JavaScript

Basta non avere affatto un hrefattributo! Qualsiasi buon ripristino CSS si occuperebbe dello stile di cursore predefinito mancante, quindi non è un problema. Quindi collega la tua funzionalità JavaScript usando le migliori pratiche graziose e discrete - che sono più mantenibili poiché la tua logica JavaScript rimane in JavaScript, anziché nel tuo markup - che è essenziale quando inizi a sviluppare applicazioni JavaScript su larga scala che richiedono che la tua logica sia suddivisa in componenti e modelli in blackbox. Maggiori informazioni su questa architettura di applicazioni JavaScript su larga scala

Esempio di codice semplice

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

Un esempio Backbone.js nella casella nera

Per un esempio di componente Backbone.js scalabile, blackbox, vedere questo esempio di jsfiddle funzionante qui . Nota come utilizziamo pratiche JavaScript discrete e in una piccola quantità di codice abbiamo un componente che può essere ripetuto più volte sulla pagina senza effetti collaterali o conflitti tra le diverse istanze del componente. Sorprendente!

Appunti

  • Se si omette l' hrefattributo asull'elemento, l'elemento non sarà accessibile mediante la tabnavigazione con i tasti. Se si desidera che tali elementi siano accessibili tramite la tabchiave, è possibile impostare l' tabindexattributo o utilizzare buttoninvece gli elementi. Puoi facilmente modellare gli elementi dei pulsanti in modo che assomiglino ai normali collegamenti, come indicato nella risposta di Tracker1 .

  • L'omissione hrefdell'attributo asull'elemento farà sì che Internet Explorer 6 e Internet Explorer 7 non assumano lo a:hoverstile, motivo per cui abbiamo invece aggiunto un semplice shim JavaScript per farlo tramite a.hover. Il che è perfettamente ok, come se non avessi un attributo href e nessun degrado grazioso, il tuo link non funzionerà comunque - e avrai problemi più grandi di cui preoccuparti.

  • Se vuoi che la tua azione continui a funzionare con JavaScript disabilitato, usa un aelemento con un hrefattributo che va a qualche URL che eseguirà l'azione manualmente invece che tramite una richiesta Ajax o qualunque cosa dovrebbe essere la strada da percorrere. Se lo stai facendo, vuoi assicurarti di fare una event.preventDefault()chiamata al clic per assicurarti che quando si fa clic sul pulsante non segua il collegamento. Questa opzione è chiamata degradazione aggraziata.


163
Fai attenzione, lasciare disattivati ​​gli attributi href non è compatibile con più browser e perderai cose come gli effetti hover in Internet Explorer
Thomas Davis,

16
Attenzione: l' buttonapproccio in stile link suggerito qui è afflitto dall'inevitabile stato attivo "3d" in IE9 e inferiori .
Brennan Roberts,

44
Trovo che questa risposta sia eccessivamente dogmatica. Ci sono momenti in cui vuoi solo applicare il comportamento JS a 1 o 2 di un href. In tal caso è eccessivo definire CSS extra e iniettare un'intera funzione JS. In alcuni casi (ad es. L'aggiunta di contenuti tramite un CMS) in realtà non ti è consentito iniettare nuovo CSS o JS autonomo e inline è tutto ciò che puoi fare. Non vedo come la soluzione inline sia meno gestibile in pratica per 1 o 2 JS a href. Diffidare sempre delle affermazioni generali generali sulle cattive pratiche, compresa questa :)
Jordan Rieger,

17
Con tutte quelle "note" che sono difficili da risolvere (l'impostazione di un tabindex richiede problemi su una pagina complessa!). Molto meglio fare solo javascript:void(0). Questa è la risposta pragmatica e l'unica risposta sensata nel mondo reale.
Abhi Beckert,

14
Se ti interessa rendere accessibile (e dovresti) la tua applicazione web, semplicità e sanità mentale sostengono per href. La follia sta nella direzione del tabindex.
jkade,

328

'#'riporterà l'utente all'inizio della pagina, quindi di solito vado con void(0).

javascript:; si comporta anche come javascript:void(0);


68
Il modo per evitarlo è restituire false nel gestore eventi onclick.
Guvante,

34
Restituire false nel gestore eventi non evita che se JavaScript JS non viene eseguito correttamente.
Quentin,

28
usando "#someNonExistantAnchorName" funziona bene perché non ha un posto dove saltare.
scunliffe,

21
Se hai un href di base, allora #o #somethingti porterà a quell'ancoraggio sulla pagina href di base , anziché sulla pagina corrente.
Abhi Beckert,

11
Lo shebang ( #!) fa il trucco ma è decisamente una cattiva pratica.
Neel,

276

Vorrei suggerire onestamente nessuno dei due. Userei uno stilizzato <button></button>per quel comportamento.

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

In questo modo puoi assegnare il tuo onclick. Suggerisco anche l'associazione tramite script, non usando l' onclickattributo sul tag element. L'unico gotcha è l'effetto di testo 3D psuedo nei vecchi IE che non può essere disabilitato.


Se DEVI usare un elemento A, usa javascript:void(0);per i motivi già menzionati.

  • Intercetterà sempre nel caso in cui l'evento onclick fallisca.
  • Non si verificheranno chiamate di caricamento errate o l'attivazione di altri eventi in base a una modifica dell'hash
  • Il tag hash può causare comportamenti imprevisti se il clic cade (clic sul clic), evitarlo a meno che non sia un comportamento fall-through appropriato e si desidera modificare la cronologia di navigazione.

NOTA: è possibile sostituirlo 0con una stringa come quella javascript:void('Delete record 123')che può fungere da indicatore aggiuntivo che mostrerà cosa farà effettivamente il clic.


In IE8 / IE9, non riesco a rimuovere l'offset "3D" 1px nello stato attivo del pulsante.
Brennan Roberts,

@BrennanRoberts Sì, sfortunatamente, qualsiasi stile di pulsanti è più problematico con IE ... Sento ancora che probabilmente è l'approccio più appropriato, non che a volte non infranga le mie regole.
Tracker1

Quindi non usare <button>ma un input type=buttoninvece?
Patrik Affentranger,

4
Quindi usa un <clickable>elemento. O <clickabletim>se preferisci. Sfortunatamente, l'uso di un tag non standard o di un semplice div potrebbe rendere difficile per gli utenti della tastiera focalizzare l'elemento.
joeytwiddle,

28
Questa risposta dovrebbe essere al top. Se stai riscontrando questo dilemma, è probabile che tu abbia effettivamente bisogno di a button. E IE9 sta rapidamente perdendo quote di mercato, per fortuna, e l'effetto attivo 1px non dovrebbe impedirci di usare il markup semantico. <a>è un link, è pensato per inviarti da qualche parte, per le azioni che abbiamo <button>.
mjsarfatti,

141

Il primo, idealmente con un vero link da seguire nel caso in cui l'utente abbia JavaScript disabilitato. Assicurati solo di restituire false per evitare che l'evento click venga attivato se JavaScript viene eseguito.

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

Se usi Angular2, funziona in questo modo:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>.

Vedi qui https://stackoverflow.com/a/45465728/2803344


19
Quindi negli agenti utente con JavaScript abilitato e la funzione supportata esegue una funzione JavaScript, che ricade (per gli agenti utente in cui JS fallisce per qualsiasi motivo) su un collegamento nella parte superiore della pagina? Questo è raramente un fallback ragionevole.
Quentin,

21
"idealmente con un vero link da seguire nel caso in cui l'utente abbia JavaScript disabilitato", dovrebbe andare su una pagina utile non #, anche se è solo una spiegazione che il sito ha bisogno di JS per funzionare. per quanto riguarda il fallimento, mi aspetto che lo sviluppatore utilizzi il corretto rilevamento delle funzionalità del browser, ecc. prima della distribuzione.
Zach,

Suppongo (spero) che qualcosa del genere sia solo per mostrare un popup o qualcosa di altrettanto semplice. In tal caso, il valore predefinito sarebbe l'URL della pagina popup. Se questo fa parte di un'applicazione Web o la disabilitazione di JS interromperebbe totalmente la pagina, questo codice presenta altri problemi ...
Brian Moeskau,

5
Le mie app Web sono progettate per degradare con garbo, quindi il collegamento sarà comunque una pagina utile. A meno che la tua app web non sia un client di chat o qualcosa di interattivo, questo dovrebbe funzionare se ti impegni a progettare pensando al degrado.
Zach,

2
Il problema è se myJsFunc genera un errore, non verrà catturato per il ritorno falso.
Tracker 1

106

Né se me lo chiedi;

Se il tuo "link" ha il solo scopo di eseguire un codice JavaScript, non si qualifica come un link; piuttosto un pezzo di testo con una funzione JavaScript accoppiata ad esso. Consiglierei di usare un <span>tag con un onclick handlerallegato ad esso e alcuni CSS di base per imitare un collegamento. Vengono creati collegamenti per la navigazione e, se il codice JavaScript non è destinato alla navigazione, non dovrebbe essere un <a>tag.

Esempio:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>


126
Questo approccio limita il "collegamento" a un'operazione solo del mouse. Un ancoraggio può essere visitato tramite la tastiera e il suo evento "onclick" viene generato quando si preme il tasto Invio.
AnthonyWJones,

40
I colori hardcoding nei CSS impediscono al browser di utilizzare colori personalizzati che l'utente può definire, il che può costituire un problema di accessibilità.
Hosam Aly,

30
<span>s non sono fatti per fare nulla. <A>e <buttons>sono usati per questo!
redShadow

22
L'uso buttonsè una scelta migliore qui mentre l'utilizzo di spannon lo è.
apnerve il

1
Penso che uno span sia meglio di un tag anchor. Il tag di ancoraggio esiste per indirizzarti all'attributo href obbligatorio. Se non hai intenzione di usare l'href, non usare un'ancora. Non limita il collegamento al mouse solo perché non è un collegamento. Non ha un href. È più simile a un pulsante ma non pubblica. L'intervallo non destinato a fare nulla è completamente invalido. Considera un menu a discesa che si attiva al passaggio del mouse. Probabilmente è una combinazione di span e div, che svolgono la funzione di un pulsante che espande un'area sullo schermo.
NibblyPig

97

Idealmente lo faresti:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

O, ancora meglio, avresti il ​​link di azione predefinito nell'HTML e aggiungeresti l'evento onclick all'elemento in modo discreto tramite JavaScript dopo il rendering del DOM, assicurando così che se JavaScript non è presente / utilizzato non lo fai hanno gestori di eventi inutili che coprono il tuo codice e potenzialmente offuscano (o almeno distraggono) il tuo contenuto reale.


76

L'uso #rende solo alcuni movimenti divertenti, quindi consiglierei di usare #selfse si desidera risparmiare sugli sforzi di battitura di JavaScript bla, bla,.


7
WOW, pollice in alto per questo suggerimento. Non ho mai saputo che potresti usare i #selftag nominati ed evitare il fastidioso comportamento del browser di saltare all'inizio della pagina. Grazie.
alonso.torres,

34
Per riferimento, #selfnon sembra essere speciale. Qualsiasi identificatore di frammento che non corrisponde al nome o all'ID di alcun elemento nel documento (e non è vuoto o "in alto") dovrebbe avere lo stesso effetto.
cHao,

1
Di solito uso solo un nome di ancoraggio inventato, ma penso che inizierò a farlo per essere coerente in tutto il mio lavoro.
Douglas.Sesar,

11
Ho suggerito di stabilire una #voidconvenzione nell'altro commento, ma in realtà #selfè il più breve e facile da memorizzare. Tutto è meglio di#
jakub.g

6
Ma se fai clic su quel link, sarà strano per l'utente vedere "#voidale" nell'URL, aspetto e errore o errore, lo stesso con # stesso o qualsiasi altra cosa.
pmiranda,

68

Io uso il seguente

<a href="javascript:;" onclick="myJsFunc();">Link</a>

anziché

<a href="javascript:void(0);" onclick="myJsFunc();">Link</a>

2
Uso javascript:(senza punto e virgola) perché appare più pulito nella barra di stato al passaggio del mouse.
Boann,

4
Questo codice può causare brutte sorprese in IE precedenti. Ad un certo punto era solito interrompere qualsiasi effetto di animazione con immagini, inclusi rollover e persino gif animate: groups.google.com/forum/#!topic/comp.lang.javascript/…
Ilya Streltsyn

Puoi sempre fare ... javascript:void('Do foo')poiché void tornerà indefinito a prescindere, fornirà un indicatore all'utente che cosa farà il clic. Dove Do foopuò essere Delete record Xo qualunque cosa tu voglia.
Tracker 1

53

Sono d'accordo con suggerimenti altrove che affermano che è necessario utilizzare un normale URL hrefnell'attributo, quindi chiamare alcune funzioni JavaScript in onclick. Il difetto è che si aggiungono automaticamente return falsedopo la chiamata.

Il problema con questo approccio è che se la funzione non funzionerà o se ci saranno problemi, il collegamento diventerà non cliccabile. L'evento onclick tornerà sempre false, quindi l'URL normale non verrà chiamato.

C'è una soluzione molto semplice. Lascia che la funzione ritorni truese funziona correttamente. Quindi utilizzare il valore restituito per determinare se il clic deve essere annullato o meno:

JavaScript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

Si noti che annullo il risultato della doSomething()funzione. Se funziona, tornerà true, quindi verrà negato ( false) e path/to/some/URLnon verrà chiamato. Se la funzione tornerà false(ad esempio, il browser non supporta qualcosa utilizzato all'interno della funzione o qualsiasi altra cosa vada storta), viene negato truee path/to/some/URLviene chiamato.


50

#è migliore di javascript:anything, ma quanto segue è ancora meglio:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

Dovresti sempre cercare un degrado aggraziato (nel caso in cui l'utente non abbia JavaScript abilitato ... e quando è con specifiche e budget). Inoltre, è considerato una forma errata utilizzare attributi e protocollo JavaScript direttamente in HTML.


1
@Muhd: il ritorno dovrebbe attivarsi clicksui link ...
Ry-

50

Consiglio invece di utilizzare un <button>elemento, soprattutto se si suppone che il controllo produca una modifica nei dati. (Qualcosa come un POST.)

È ancora meglio se si iniettano gli elementi in modo discreto, un tipo di miglioramento progressivo. (Vedi questo commento .)


2
Anch'io penso che questa sia la soluzione migliore. Se si dispone di un elemento destinato a eseguire un'azione, non vi è motivo per cui sia un collegamento.
mateuscb,

Se lo chiedessi e il tuo href sembrerebbe "#something" alcune delle altre risposte elencate potrebbero servire, ma: senza l'href che si collega a qualcosa di sensato, non ha senso avere un href, o addirittura un collegamento del tutto. L'uso suggerito del pulsante potrebbe fare o utilizzare qualsiasi altro elemento, ma un link ringrazia i link da nessuna parte.
kontur,

1
Un altro vantaggio di ciò è che Bootstrap .btnrende pulsanti e collegamenti esattamente uguali.
Ciro Santilli 19 冠状 病 六四 事件 法轮功

Dal punto di vista dell'utente, buttoninoltre non introduce un # nell'URL o mostra l' ahref come javascript :;
Coll

39

A meno che tu non stia scrivendo il link utilizzando JavaScript (in modo da sapere che è abilitato nel browser), dovresti idealmente fornire un link corretto per le persone che navigano con JavaScript disabilitato e quindi impedire l'azione predefinita del link nel tuo clic gestore di eventi. In questo modo quelli con JavaScript abilitato eseguiranno la funzione e quelli con JavaScript disabilitato passeranno a una pagina appropriata (o posizione all'interno della stessa pagina) anziché fare semplicemente clic sul collegamento e non succede nulla.


36

Sicuramente hash ( #) è meglio perché in JavaScript è uno pseudoscheme:

  1. inquina la storia
  2. crea un'istanza di nuova copia del motore
  3. funziona in ambito globale e non rispetta il sistema di eventi.

Ovviamente "#" con un gestore onclick che impedisce l'azione predefinita è [molto] migliore. Inoltre, un collegamento che ha il solo scopo di eseguire JavaScript non è in realtà un "collegamento" a meno che non si invii l'utente a un ancoraggio ragionevole sulla pagina (solo # verrà inviato all'inizio) quando qualcosa va storto. Puoi semplicemente simulare l'aspetto del link con il foglio di stile e dimenticarti di href.

Inoltre, per quanto riguarda il suggerimento di cowgod, in particolare questo: ...href="javascript_required.html" onclick="...questo è un buon approccio, ma non distingue tra gli scenari "JavaScript disabilitato" e "onclick fail".


1
@Berker Yüceer, perché CW?
Consulenza gratuita

30

Di solito vado per

<a href="javascript:;" onclick="yourFunction()">Link description</a>

È più breve di javascript: void (0) e fa lo stesso.


27

Io userei:

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

Motivi:

  1. Questo rende hrefsemplice, i motori di ricerca ne hanno bisogno. Se usi qualcos'altro (come una stringa), potrebbe causare un 404 not founderrore.
  2. Quando il mouse passa sopra il collegamento, non mostra che si tratta di uno script.
  3. Usando return false;, la pagina non salta all'inizio o non rompe il backpulsante.

non sono d'accordo con "1." causa errore quando si inserisce il collegamento al proprio script quando gli script non sono consentiti. quindi quel tipo di link dovrebbe essere aggiunto con il codice js. in questo modo le persone possono evitare quei collegamenti mentre lo script non è permesso e non vedono alcun errore.
Berker Yüceer,

25

Ho scelto l'uso javascript:void(0), perché l'utilizzo potrebbe impedire il clic con il pulsante destro del mouse per aprire il menu dei contenuti. Ma javascript:;è più corto e fa la stessa cosa.


24

Quindi, quando stai facendo alcune cose JavaScript con un <a />tag e se lo metti href="#"anche tu, puoi aggiungere return false alla fine dell'evento (in caso di associazione di eventi inline) come:

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

Oppure puoi modificare l' attributo href con JavaScript come:

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

o

<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

Ma semanticamente, tutti i modi di cui sopra per raggiungere questo obiettivo sono sbagliati (funziona bene però) . Se non viene creato alcun elemento per navigare nella pagina e associato ad alcune cose JavaScript, non dovrebbe essere un <a>tag.

Puoi semplicemente usare a <button />invece per fare cose o qualsiasi altro elemento come b, span o qualunque cosa vi si adatti secondo le tue necessità, perché ti è permesso aggiungere eventi su tutti gli elementi.


Quindi, c'è un vantaggio da usare <a href="#">. Per impostazione predefinita, ottieni il puntatore del cursore su quell'elemento a href="#". Per questo, penso che puoi usare CSS per questo tipo cursor:pointer;che risolve anche questo problema.

E alla fine, se stai vincolando l'evento dal codice JavaScript stesso, puoi farlo event.preventDefault()per raggiungere questo obiettivo se stai usando un <a>tag, ma se non stai usando un <a>tag per questo, lì ottieni un vantaggio, non Non è necessario farlo.

Quindi, se vedi, è meglio non usare un tag per questo tipo di cose.


23

Non utilizzare i collegamenti al solo scopo di eseguire JavaScript.

L'uso di href = "#" fa scorrere la pagina verso l'alto; l'uso di void (0) crea problemi di navigazione all'interno del browser.

Invece, usa un elemento diverso da un link:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

E lo stile con CSS:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}

13
Usa un pulsante, non una campata. I pulsanti rientrano naturalmente nell'ordine di messa a fuoco, quindi è possibile accedervi senza mouse / trackpad / ecc.
Quentin,

4
Aggiungendo il commento di ton Quentin: come attualmente scritto, gli utenti della tastiera non raggiungeranno l' spanelemento perché è un elemento non focalizzabile. Ecco perché hai bisogno di un pulsante.
Tsundoku,

1
Puoi renderlo focalizzabile aggiungendolo tabindex="0"all'intervallo. Detto questo, usare il pulsante è migliore perché ti dà la funzionalità desiderata gratuitamente. Per renderlo accessibile usando un intervallo non è solo necessario collegare un gestore di clic, ma un gestore di eventi della tastiera che cerca le pressioni della barra spaziatrice o il tasto Invio e quindi attiva il normale gestore di clic. Dovresti anche cambiare il secondo selettore CSS in .funcActuator:hover, .funcActuator:focusmodo che il fatto che l'elemento abbia lo stato attivo sia evidente.
Codice inutile

22

Sarebbe meglio usare jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

e omettere entrambi href="#"e href="javascript:void(0)".

Il markup del tag anchor sarà simile

<a onclick="hello()">Hello</a>

Abbastanza semplice!


5
Questo è quello che stavo per dire. Se un collegamento ha un URL di fallback che ha senso, usalo. Altrimenti, ometti l'href o usa qualcosa di più semanticamente appropriato di un <a>. Se l'unica ragione per cui tutti stanno sostenendo, incluso l'href, è mettere il dito al passaggio del mouse, un semplice "a {pointer: pointer;}" farà il trucco.
Matt Kantor,

12
Questo dà un'accessibilità terribile. Provalo in SO: non puoi contrassegnare un post senza usare il mouse. I collegamenti "link" e "edit" sono accessibili tramite tabulazione, ma "flag" non lo è.
Nicolás,

6
Sono d'accordo con questa opzione. Se l'ancora non ha altro scopo che JavaScript, non dovrebbe avere un href. @Fatih: l'uso di jQuery significa che se JavaScript è disabilitato, il collegamento NON avrà un puntatore.
Scott Rippey,

3
Se hai intenzione di seguire questa strada, perché non associare anche il clic usando jQuery? Parte del bello dell'utilizzo di jQuery è la possibilità di separare il tuo javascript dal tuo markup.
Muhd,

4
Non posso credere che questa risposta abbia 11 voti. È terribile. Perché stai aggiungendo uno stile tramite Javascript (e jQuery ??) e quindi definendo la tua azione onclick in HTML? Terribile.
MMM,

20

Se si utilizza AngularJS , è possibile utilizzare quanto segue:

<a href="">Do some fancy JavaScript</a>

Che non farà nulla.

Inoltre

  • Non ti porterà in cima alla pagina, come con (#)
    • Pertanto, non è necessario restituire esplicitamente falsecon JavaScript
  • È breve e conciso

6
Ma questo causerebbe il ricaricamento della pagina e poiché usiamo sempre javascript per modificare la pagina, questo è inaccettabile.
Henry Hu,

@HenryHu Ho capito che il motivo per cui non è stato ricaricato era a causa di AngularJS. Vedi la mia risposta aggiornata.
Whirlwin,

19

Se non c'è hrefforse non c'è motivo di usare un tag anchor.

È possibile allegare eventi (clic, passaggio del mouse, ecc.) Su quasi tutti gli elementi, quindi perché non utilizzare solo a spano a div?

E per gli utenti con JavaScript disabilitato: se non esiste un fallback (ad esempio un'alternativa href), almeno non dovrebbero essere in grado di vedere e interagire con quell'elemento, qualunque esso sia un <a>o un <span>tag.


19

Di solito, è necessario disporre sempre di un collegamento di riserva per assicurarsi che i client con JavaScript disabilitato abbiano ancora alcune funzionalità. Questo concetto si chiama JavaScript discreto.

Esempio ... Supponiamo che tu abbia il seguente link di ricerca:

<a href="search.php" id="searchLink">Search</a>

Puoi sempre fare quanto segue:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

In questo modo, le persone con JavaScript disabilitato vengono indirizzate search.phpmentre i tuoi spettatori con JavaScript visualizzano le tue funzionalità avanzate.


17

Li uso personalmente in combinazione. Per esempio:

HTML

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

con un po 'di jQuery

$('a[href="#"]').attr('href','javascript:void(0);');

o

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

Ma lo sto usando solo per impedire che la pagina salti in cima quando l'utente fa clic su un'ancora vuota. Raramente utilizzo onClick e altri oneventi direttamente in HTML.

Il mio suggerimento sarebbe di usare l' <span>elemento con l' classattributo invece di un'ancora. Per esempio:

<span class="link">Link</span>

Quindi assegnare la funzione a .linkcon uno script racchiuso nel corpo e appena prima del </body>tag o in un documento JavaScript esterno.

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

* Nota: per gli elementi creati dinamicamente, utilizzare:

$('.link').on('click', function() {
    // do something
});

E per gli elementi creati dinamicamente che vengono creati con elementi creati dinamicamente, utilizzare:

$(document).on('click','.link', function() {
    // do something
});

Quindi puoi modellare l'elemento span in modo che appaia come un'ancora con un piccolo CSS:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

Ecco un esempio di jsFiddle di cui sopra.


16

A seconda di ciò che vuoi realizzare, potresti dimenticare il clic e usare solo l'href:

<a href="javascript:myJsFunc()">Link Text</a>

Evita la necessità di restituire false. Non mi piace l' #opzione perché, come detto, porterà l'utente in cima alla pagina. Se hai altrove da inviare all'utente se non ha JavaScript abilitato (cosa rara dove lavoro, ma un'ottima idea), il metodo proposto da Steve funziona alla grande.

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Infine, puoi usare javascript:void(0)se non vuoi che nessuno vada da nessuna parte e se non vuoi chiamare una funzione JavaScript. Funziona alla grande se hai un'immagine con cui vuoi che si verifichi un evento di passaggio del mouse, ma l'utente non può fare clic su nulla.


3
L'unico aspetto negativo di questo (dalla memoria, potrei sbagliarmi) è che IE non considera una A come A se non hai un href al suo interno. (Quindi le regole CSS non funzioneranno)
Benjol,

16

Quando ho diversi falsi link, preferisco dare loro una classe di "no-link".

Quindi in jQuery, aggiungo il seguente codice:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

E per l'HTML, il link è semplicemente

<a href="/" class="no-link">Faux-Link</a>

Non mi piace usare i tag hash a meno che non vengano usati per le ancore, e faccio quanto sopra solo quando ho più di due faux-link, altrimenti vado con javascript: void (0).

<a href="javascript:void(0)" class="no-link">Faux-Link</a>

In genere, mi piace solo evitare di usare un collegamento e avvolgere qualcosa in un arco di tempo e usarlo come un modo per attivare un codice JavaScript, come un pop-up o un rivelatore di contenuti.


16

Credo che tu stia presentando una falsa dicotomia. Queste non sono le uniche due opzioni.

Sono d'accordo con Mr. D4V360 che ha suggerito che, anche se stai usando il tag anchor, non hai davvero un anchor qui. Tutto quello che hai è una sezione speciale di un documento che dovrebbe comportarsi in modo leggermente diverso. Un <span>tag è molto più appropriato.


Inoltre, se dovessi sostituire un acon un span, dovrai ricordarti di renderlo focalizzabile tramite tastiera.
AndFisher,

16

Ho provato entrambi su google chrome con gli strumenti per sviluppatori e ci sono id="#"voluti 0,32 secondi. Mentre il javascript:void(0)metodo ha richiesto solo 0,18 secondi. Quindi in Google Chrome, javascript:void(0)funziona meglio e più velocemente.


In realtà non fanno lo stesso. # ti fa saltare in cima alla pagina.
Jochen Schultz,

13

In sostanza sto parafrasando questo articolo pratico usando il miglioramento progressivo . La risposta breve è che non usi mai javascript:void(0);o #se l'interfaccia utente non ha già dedotto che JavaScript è abilitato, nel qual caso dovresti usarejavascript:void(0); . Inoltre, non utilizzare span come link, poiché ciò è semanticamente falso all'inizio.

L'uso di percorsi URL SEO friendly nella tua applicazione, come / Home / Azione / Parametri è anche una buona pratica. Se si dispone di un collegamento a una pagina che funziona prima senza JavaScript, è possibile migliorare l'esperienza in seguito. Utilizzare un collegamento reale a una pagina di lavoro, quindi aggiungere un evento onlick per migliorare la presentazione.

Ecco un esempio Home / ChangePicture è un collegamento funzionante a un modulo in una pagina completo di interfaccia utente e pulsanti di invio HTML standard, ma sembra più bello inserito in una finestra di dialogo modale con i pulsanti jQueryUI. In entrambi i casi funziona, a seconda del browser, che soddisfa il primo sviluppo mobile.

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>

In termini di SEO preferirei così. L'uso di altrettanti URL intuitivi migliorerà sicuramente il fattore valore della pagina.
Chetabahana,
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.