Un tag anchor senza l'attributo href è sicuro?


232

È corretto utilizzare un tag anchor senza includere l' hrefattributo e invece utilizzare un gestore eventi click JavaScript? Quindi ometterei hrefcompletamente, senza nemmeno averlo vuoto ( href="").


1
L'evento onclick si attiva comunque? Voglio usare i tag anchor anziché span / div perché è l'unico tag ragionevole che supporta CSS: hover in IE
— john

3
È possibile accedere e attivare @Martin ANCHORS tramite la tastiera. Gli elementi SPAN regolari non possono. Vedi qui: jsfiddle.net/simevidas/4DTxv/2
— Šime Vidas


2
In HTML5, le ancore senza attributo href sono collegamenti ipertestuali segnaposto: dev.w3.org/html5/markup/a.html
— Ignacio Lago

1
Sei sicuro di non voler un pulsante invece? Ciò significherebbe che la tabulazione ecc funziona e che, se necessario, puoi modellare i tuoi pulsanti in modo che appaiano come collegamenti. Devo ammettere che non conosco l'hover in IE.
— robbie_c,

Risposte:


217

In HTML5, l'utilizzo di un aelemento senza hrefattributo è valido. È considerato un "collegamento ipertestuale segnaposto".

Esempio:

<a>previous</a>

Cerca "hyperlink segnaposto" nella pagina di riferimento del tag di ancoraggio w3c: https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element .

Ed è anche menzionato sul wiki qui: https://www.w3.org/wiki/Elements/a

Un collegamento segnaposto è per i casi in cui si desidera utilizzare un elemento di ancoraggio, ma non farlo navigare ovunque. Questo è utile per contrassegnare la pagina corrente in un menu di navigazione o una traccia breadcrumb. (Il vecchio approccio sarebbe stato quello di utilizzare un tag span o un tag anchor con una classe denominata "active" o "current" per modellarlo e JavaScript per annullare la navigazione.)

Un collegamento segnaposto è utile anche nei casi in cui si desidera impostare dinamicamente la destinazione del collegamento tramite JavaScript in fase di esecuzione. Devi semplicemente impostare il valore dell'attributo href e il tag anchor diventa cliccabile.

Guarda anche:


3
Qual è la definizione di "collegamento segnaposto"?
— Gyum Fox,

14
Prendere atto che senza una hrefl' cursor: pointerstile non verrà aggiunto automaticamente all'elemento.
— Luca,

38

Va bene, ma allo stesso tempo può rallentare alcuni browser.

http://webdesignfan.com/yslow-tutorial-part-2-of-3-reducing-server-calls/

Il mio consiglio è utilizzare <a href="#"> </a>

Se stai usando JQuery ricordati di usare anche:

.click(function(event){
    event.preventDefault();
    // Click code here...
});

7
Non riesco a utilizzare href = "#" perché sto utilizzando il bookmarking Ajax che comporta la modifica dell'hash, cosa posso fare?
— Giovanni

5
Invece di usare javascript: void (0); all'interno dell'href uso javascript :; è più breve scrivere.
— Alleato il

16
La penalità di prestazione si applica solo se si specifica effettivamente un attributo href vuoto. La domanda afferma che non esiste alcun attributo href.
— Pete B,

18
In realtà, secondo l'articolo (e ha senso) la potenziale penalità di prestazione si applica solo agli attributi src vuoti . Non dice nulla riguardo alle prestazioni riguardo agli attributi href vuoti.
— Bergie3000,

1
Ciao @Gunnar, il link sembra essere andato ora. Hai un altro riferimento per il reclamo?
— user31782

25

Risposta breve: No.

Risposta lunga:

Innanzitutto, senza un attributo href, non sarà un collegamento. Se non è un collegamento, non sarà accessibile da tastiera (o interruttore di respiro o vari altri dispositivi di input non basati su puntatore) (a meno che non si utilizzino funzionalità HTML 5 di tabindexcui non sono universalmente supportate). È molto raro che un controllo non abbia accesso alla tastiera.

Secondo. Dovresti avere un'alternativa per quando JavaScript non viene eseguito (poiché il caricamento dal server è stato lento, è stata interrotta una connessione Internet (ad es. Segnale mobile su un treno in movimento), JS è disattivato, ecc. Ecc.).

Sfrutta il miglioramento progressivo di JS discreto.


Il problema è che voglio qualcosa a cui posso associare un evento click con il metodo "click" di jQuery, che viene anche evidenziato e sottolineato come un collegamento quando il mouse vi scorre sopra. Cos'altro, oltre a un tag di ancoraggio senza href, può farlo senza CSS? (vale a dire così com'è senza l'aggiunta manuale di tale interazione di base, pur mantenendo la semplicità di un'assegnazione della funzione clic diretto tramite jQuery).
— Triynko,

@Triynko: utilizza un collegamento, ma fallo correttamente. Vedi l'ultima riga della risposta.
— Quentin,

5
Tabindex sui tag "a" è valido dal HTML4 (almeno) w3schools.com/tags/att_global_tabindex.asp
— technoTarek,

@technoTarek - Sì, ma hrefera obbligatorio (a meno che non fosse un'ancora con nome, nel qual caso tabindex non aveva senso). L'uso di tabindexaggiungere elementi sfocabili all'ordine di tabulazione è una nuova innovazione in HTML 5.
— Quentin,

4
Questo è semplicemente sbagliato. Se al momento facessi riferimento a una specifica precedente per HTML, non posso dire, ma secondo la specifica HTML5 è davvero perfettamente valido avere un atag senza un hrefattributo.
— michael

23

Se devi usare href per la compatibilità all'indietro, puoi anche usare

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

anziché #, se non si desidera utilizzare l'attributo


1
Avevo bisogno di un tag <a> che si comportava come un collegamento in tutte le funzioni tranne. Questo ha fatto il trucco per me.
— Jad S,

13

Il tag va bene da usare senza un attributo href. Contrariamente a molte delle risposte qui, ci sono in realtà ragioni standard per creare un'ancora quando non c'è href. Semanticamente, "a" significa un'ancora o un collegamento. Se lo usi per qualcosa che segue quel significato, allora stai bene.

Un uso standard del tag a senza href è la creazione di collegamenti denominati. Ciò consente di utilizzare un'ancora con nome = blah e in seguito è possibile creare un'ancora con href = # blah per collegarsi alla sezione denominata della pagina corrente. Tuttavia, questo è stato deprecato perché è anche possibile utilizzare gli ID nello stesso modo. Ad esempio, potresti usare un tag header con id = header e in seguito potresti avere un anchor che punta a href = # header.

Il mio punto, tuttavia, non è quello di suggerire di usare la proprietà name. Fornire solo un caso d'uso in cui non è necessario un href e quindi ragionare sul motivo per cui non è necessario.


2
Penso che la domanda che stava cercando di porre e quali siano le altre risposte indirizzate, è se è sicuro omettere l' hrefattributo per un <a>elemento che viene utilizzato come elemento interattivo (cioè un collegamento). Come hai detto, senza un hrefattributo è semplicemente ... non un collegamento, solo un'ancora, che è una cosa completamente diversa.
— BoltClock

1
Sì, ma - solo per sottolineare - il tag <a> è ancora valido in questi casi d'uso.
— monocromo

9

Dal punto di vista dell'accessibilità <a>senza un href non è tab-tab, tutti i collegamenti dovrebbero essere tab-tab quindi aggiungi un tabindex = '0 "se non hai un href.


1
Oppure utilizza un pulsante se eseguirà un'azione in-page anziché un reindirizzamento.
— SimonDever,

8

Il <a>tag senza "href" può essere utile quando si utilizzano menu a più livelli ed è necessario espandere il livello successivo ma non si desidera che l'etichetta di menu sia un collegamento attivo. Non ho mai avuto problemi ad usarlo in quel modo.


1
Hai provato ad accedere a quel menu con la tastiera?
— aij

Ho appena scoperto che su IE, se passi con il mouse su alcuni link e uno è un'ancora senza href, il piccolo popup con l'URL sottostante rimane lì, mostrando l'URL precedente, invece di scomparire. L'ancoraggio non è comunque selezionabile, quindi non è un grosso problema, ma è sufficiente per me andare con un div.
— Andrew,

1

In alcuni browser incontrerai problemi se non stai dando un attributo href. Ti suggerisco di scrivere il tuo codice in questo modo:

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

puoi sostituire yourcode () con la tua funzione o logica, ma ricorda di aggiungere return false; dichiarazione alla fine.


Sto usando Backbone.js con Backbone.Router e ho #per la pagina dell'indice. Per alcuni dei miei collegamenti della barra di navigazione non voglio innescare un percorso verso il #quale è ciò che accade se lo usi a href="#"da solo. L'utilizzo <a href="#" onclick="return false;"interrompe l'attivazione del percorso, ma l'evento click fa ancora bolle nel mio gestore (che utilizza gli eventi DOM collegati tramite jQuery e Backbone.Radio). Grazie @ shashwat13 :)
— David Williamson,
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.