Un href vuoto è valido?


179

Uno dei nostri sviluppatori Web utilizza il seguente codice HTML come segnaposto per la creazione di un elenco a discesa.

<a href="" class="arrow"></a>

Questo tag di ancoraggio è considerato valido?

Poiché non esiste alcun valore href, viene visualizzato come non funzionante in alcuni dei nostri rapporti del controllo link.


10
Tuttavia, non funziona in IE! Bene funziona in IE ma con un comportamento completamente diverso, contro le specifiche. Quindi è valido per specifica, ma non in pratica: (((
ZhongYu

Espandendo ciò che Bayou.io ha detto, IE si collega alla directory sopra il documento: stackoverflow.com/questions/7966791/…
Nate,

1
Sì, un href vuoto nelle versioni precedenti di IE (7/8, ecc.) Potrebbe avere conseguenze negative, come l'elenco delle directory. C'è molto documentato sull'argomento se lo cerchi su Google
Ringo,

ad esempio: gtmetrix.com/avoid-empty-src-or-href.html . Non importa solo i vecchi browser, influisce sui browser IE, Edge e Webkit attuali.
Ringo,

Risposte:


60

Sebbene questa domanda abbia già una risposta ( tl; dr: yes, un hrefvalore vuoto è valido), nessuna delle risposte esistenti fa riferimento alle specifiche pertinenti.

Una stringa vuota non può essere un URI. Tuttavia, l' hrefattributo non accetta solo URI come valore, ma anche riferimenti URI. Una stringa vuota può essere un riferimento URI.

HTML 4.01

HTML 4.01 utilizza RFC 2396 , dove è indicato nella sezione 4.2. Riferimenti dello stesso documento (grassetto enfasi mio):

Un riferimento URI che non contiene un URI è un riferimento al documento corrente. In altre parole, un riferimento URI vuoto all'interno di un documento viene interpretato come riferimento all'inizio di quel documento e un riferimento contenente solo un identificatore di frammento è un riferimento al frammento identificato di quel documento.

RFC 2396 è obsoleto da RFC 3986 (che è attualmente lo standard URI IETF ), che sostanzialmente dice lo stesso .

HTML5

HTML5 utilizza ( URL valido potenzialmente circondato da spaziURL valido ) le specifiche dell'URL di W3C , che è stata interrotta. Invece dovrebbe essere usato lo standard URL di WHATWG (vedere l'ultima sezione).

HTML 5.1

HTML 5.1 utilizza ( URL valido potenzialmente circondato da spaziURL valido ) URL di WHATWG Standard (vedere la sezione successiva).

WHATWG HTML

L'HTML di WHATWG utilizza ( URL valido potenzialmente circondato da spazi ) la definizione di stringa URL valida dallo Standard URL di WHATWG , dove afferma che può essere una stringa URL relativo con frammento , che deve almeno essere una stringa URL relativa , che può essere una stringa percorso-relativo-schema-meno-URL , che è una stringa percorso-relativo-URL che non inizia con una stringa di schema seguita da :, e la sua definizione dice (grassetto mio accento):

Una stringa URL relativo al percorso deve essere zero o più stringhe del segmento del percorso URL, separate l'una dall'altra da U + 002F (/) e non iniziare con U + 002F (/).


184

È valido

Tuttavia, la pratica standard è di usare href="#"o talvolta href="javascript:;".


23
Come indicato in RFC 2396: un riferimento URI che non contiene un URI è un riferimento al documento corrente. In altre parole, un riferimento URI vuoto all'interno di un documento è interpretato come un riferimento all'inizio di tale documento,
Ottobre

32
quando faccio clic href="#", lo stato attivo href="javascript:;"si sposta all'inizio della pagina in IE, quindi penso che sia meglio
Deckard

32
href = "#" è un anti-pattern. Aggiunge una voce aggiuntiva alla cronologia del browser e in alcuni casi fa scorrere il browser verso l'alto, puoi semplicemente tralasciare l'attributo href se non lo stai utilizzando. verrà impostato automaticamente su "" e quindi ricaricare la pagina se non viene impedito.
Tosh

16
@tosh, no, sono abbastanza sicuro che se lasci fuori l'attributo href, l'elemento <a> non ha lo stile di un link, non è focalizzabile e non crea un link come <a href = "" > oppure <a href>. Se funziona per te, potresti condividere un JSFiddle che lo mostra?
Gui Prá,

6
@hosh, sai cos'è divertente? Apparentemente da HTML5, omettere l'attributo dovrebbe funzionare in questo modo, vedi w3.org/TR/html5/text-level-semantics.html#the-a-element (Grazie halfdan per aver inviato la risposta qui sotto.) Apparentemente questo non è stato implementato ancora dai fornitori e poiché è ancora solo una raccomandazione del candidato, è difficile dire se sarà mantenuto nello standard finale o se i fornitori si conformeranno prima.
Gui Prá,

115

Come altri hanno già detto, è valido.

Ci sono alcuni aspetti negativi di ogni approccio:

href="#" aggiunge una voce aggiuntiva alla cronologia del browser (il che è fastidioso quando, ad esempio, il back-button).

href="" ricarica la pagina

href="javascript:;" non sembra avere alcun problema (oltre a sembrare disordinato e insignificante) - qualcuno ne conosce qualcuno?


22
Un altro interessante è href = "//: 0", che non farà una richiesta al server né lascerà alcuna cronologia.
diachedelico

2
//: 0 impedisce il caricamento di alcune delle mie immagini in Chrome. Sembra che Chrome lo interpreti come un comando di annullamento.
David Grenier,

5
href: "javascript :;" era proprio quello di cui avevo bisogno per far funzionare le cose in entrambe le visualizzazioni Web di Android e iOS
pazzesco

2
IE si collega alla directory sopra il documento: stackoverflow.com/questions/7966791/…
Nate

1
Non l'ho provato, ma sospetto che href = "javascript :;" violerebbe la politica di sicurezza dei contenuti che non consente JavaScript incorporato. Se intendi attivare questa politica, utilizzerei una delle alternative.
Segna bene il

60

Sebbene possa essere completamente valido HTML per non includere un href, specialmente con un gestore onclick, ci sono alcune cose da considerare: non sarà focalizzabile da tastiera senza avere un valore tabindex impostato. Inoltre, questo sarà inaccessibile al software dello screen reader con Internet Explorer, poiché IE segnalerà attraverso le interfacce di accessibilità che qualsiasi elemento di ancoraggio senza un attributo href non è focalizzabile, indipendentemente dal fatto che il tabindex sia stato impostato.

Quindi, mentre quanto segue può essere completamente valido:

<a class="arrow">Link content</a>

È molto meglio aggiungere esplicitamente un attributo href a effetto nullo

<a href="javascript:void(0);" class="arrow">Link content</a>

Per il pieno supporto di tutti gli utenti, se si utilizza la classe con CSS per il rendering di un'immagine, è necessario includere anche alcuni contenuti di testo, come l'attributo title per fornire una descrizione testuale di ciò che sta accadendo.

<a href="javascript:void(0);" class="arrow" title="Go to linked content">Link content</a>

1
Grazie per aver menzionato che l'omissione hrefguasterà con le interfacce di accessibilità.
Daniel Sokolowski,

1
Aggiungo anche - dal punto di vista dell'accessibilità - che l'impostazione del hrefvalore su qualcosa di diverso da un percorso relativo / assoluto provocherà problemi con lo screen reader. Evitare di utilizzare un simbolo cancelletto / cancelletto come soluzione alternativa per questo problema in quanto non è previsto per questo. Gli screen reader possono (attualmente VoiceOver) annunciare il tuo link come identificatore di frammento (link a qualche parte della pagina corrente) ed è valido anche dal punto di vista degli standard. vedi w3.org/2001/tag/2011/01/HashInURI-20110115#NakedHash
Michel Hébert

27

L'attuale bozza HTML5 consente inoltre di omettere completamente l'attributo href.

Se l'elemento a non ha alcun attributo href, allora l'elemento rappresenta un segnaposto per il quale altrimenti sarebbe stato inserito un collegamento, se fosse stato rilevante.

Per rispondere alla tua domanda: Sì, è valido.


6
sì, MA - un <a>elemento senza no hrefè disegnato in modo diretto in alcuni browser. Ad esempio, gli stili ": hover" non funzionano in Chrome (e altre cose strane)
Alex

Un <a>tag senza a hrefrappresenta qualcos'altro , non un collegamento (tradizionalmente un'ancora). Inoltre, esiste una differenza tra un attributo facoltativo e un attributo che può essere vuoto.
Kobi,

19

In effetti, puoi lasciarlo vuoto (il validatore W3 non si lamenta).

Fare un ulteriore passo avanti nell'idea: tralasciare = "". Il vantaggio di ciò è che il collegamento non è trattato come un ancoraggio alla pagina corrente.

<a href>sth</a>

Sebbene: <a href></a>Attributo href senza un valore esplicito visto. L'attributo può essere eliminato da IE7.
24

1
Mi piace anche questa soluzione. Conoscete altri svantaggi tranne il comportamento IE7?
rinat.io

Questa è sintassi illegale. Secondo la specifica "La sintassi [Attributo vuoto] è consentita solo per gli attributi booleani."
Robert Siemer,

9

Mentre il validatore di W3 potrebbe non lamentarsi di un hrefattributo vuoto , l'attuale progetto di lavoro HTML5 specifica:

L' hrefattributo on ae gli areaelementi devono avere un valore che sia un URL valido potenzialmente circondato da spazi.

Un URL valido è un URL conforme allo Standard URL . Ora l'URL Standard è un po 'confuso per farti andare in giro, tuttavia da nessuna parte si afferma che un URL può essere una stringa vuota.

... il che significa che una stringa vuota non è un URL valido.

La bozza di lavoro HTML5 prosegue, tuttavia, affermando:

Nota: l' hrefattributo on ae gli areaelementi non sono richiesti ; quando quegli elementi non hanno hrefattributi non creano collegamenti ipertestuali.

Ciò significa che possiamo semplicemente omettere del hreftutto l' attributo:

<a class="arrow"></a>

Se la tua intenzione è che questi elementi senza bisogno debbano ancora richiedere l' hrefinterazione della atastiera, dovrai seguire la normale strada dell'assegnazione di un rolee tabindexaccanto ai soliti gestori di clic / keydown:

<a class="arrow" role="button" tab-index="0"></a>

Infatti. Sfortunatamente, come hai citato, tralasciarlo non lo hrefrende un collegamento ipertestuale, il che rende la onclickfunzionalità inaccessibile agli utenti della tastiera.
aij

7

Un avvertimento:

Nella mia esperienza, omettere l' hrefattributo causa problemi di accessibilità in quanto la navigazione da tastiera lo ignorerà e non gli darà mai la concentrazione come quando sarà presente href. Includere manualmente il tuo elemento nel tabindex è un modo per aggirare questo.


3

è valido ma come ha detto UpTheCreek "Ci sono alcuni aspetti negativi di ogni approccio"

se chiami ajax tramite un tag lascia href = "" in questo modo manterrà la pagina ricaricata e il codice ajax non verrà mai chiamato ...

Ho appena pensato che sarebbe bello condividere


2

Prova <a href="#" class="arrow">invece a fare . (Nota il #carattere nitido ).

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.