2012-05-06 19 views
5

Sono workign su un sito che utilizza un listener per l'hash per mostrare e nascondere i DIV del contenuto e scorrere fino all'ancora denominata con lo stesso nome.Nome ancoraggio (A) con NOME uguale a un conflitto ID DIV

Avevo uno strano problema in cui invece di scorrere fino all'ancora, scorreva verso il DIV con l'ID uguale al nome dell'ancora.

Dopo aver modificato l'ID DIV in qualcosa di diverso, il comportamento era quello previsto.

Non riesco a trovare alcuna documentazione su questo e mi chiedevo se questo è un comportamento documentato.

codice che funziona:

<a name="top">top</a> 

<p id="bottomx" style="height: 1800px;"> 
<a href="#top">top</a> 
<a href="#bottom">bottom</a> 
<br> 
</p> 
<a name="bottom">bottom</a> 

Non funziona come previsto:

<a name="top">top</a> 

<p id="bottom" style="height: 1800px;"> 
<a href="#top">top</a> 
<a href="#bottom">bottom</a> 
<br> 
</p> 
<a name="bottom">bottom</a> 

Nel secondo esempio, sarebbe scorrere fino alla P denominato "fondo". Allo stesso modo, se faccio un DIV in fondo alla pagina con un ID di "bottom" e premo page.html # bottom, scorre verso il basso fino a quel DIV.

Sembra solo confusionario. Un'idea perché questo sta funzionando in questo modo? Stesso comportamento in Safari e FF.

+0

Interessante - Sto avendo difficoltà a trovare questo nelle specifiche HTML5 del tutto. –

+1

Se trovato questo nella [specifica HTML4] (http://www.w3.org/TR/html401/struct/links.html#h-12.2.3): * "Gli attributi' id' e 'name' condividono lo stesso spazio dei nomi, il che significa che non possono entrambi definire un'ancora con lo stesso nome nello stesso documento. "*. Presumo che questo sia stato ridefinito nelle specifiche HTML5 per considerare i browser di comportamento comuni implementati. –

risposta

7

id has precedence over name:

Per i documenti HTML (e tipi MIME HTML), il seguente modello di elaborazione deve essere seguita per determinare ciò che la parte indicata del documento è.

  1. analizzare l'URL, e lasciare fragid sia la componente del URL .

  2. Se fragid è la stringa vuota, la parte indicata del documento è la parte superiore del documento; interrompere l'algoritmo qui.

  3. Sia decodificato fragid essere il risultato di espansione eventuali sequenze di ottetti cento codificato in fragid che sono validi UTF-8 sequenze in caratteri Unicode definiti dallo UTF-8. Se gli ottetti codificati in percentuale in quella stringa non sono sequenze UTF-8 valide (ad esempio, si espandono in punti di codice surrogati), quindi salta questo passaggio e il successivo .

  4. Se questo passaggio non viene saltata e c'è un elemento DOM che ha un ID esattamente uguale a fragid decodificato, poi il primo tale elemento per albero è la parte indicata del documento; stop l'algoritmo qui.

  5. Se c'è un elemento nel DOM che ha un attributo nome cui valore è esattamente uguale a fragid (fragid non decodificato), quindi il primo tale elemento per albero è la parte indicata del documento ; interrompere l'algoritmo qui.

  6. Se fragid è una corrispondenza senza distinzione tra maiuscole e minuscole ASCII per la stringa superiore, , la parte indicata del documento è la parte superiore del documento; interrompi l'algoritmo qui.

  7. In caso contrario, non esiste una parte indicata del documento.

+0

Immagino di non aver mai pensato che si potesse usare l'hash per scorrere fino a un ID o NOME di qualsiasi cosa diversa da . Ho imparato qualcosa di nuovo oggi. – Jazzy

1

Il HTML 4.01 e XHTML 1.0 specifiche richiedono che un attributo name in un elemento a non deve essere lo stesso del valore di un attributo id, tranne quando impostato sullo stesso elemento, il documento è in errore. I browser sono liberi di applicare la propria gestione degli errori, che può essere piuttosto non pianificata.

Le bozze HTML5 specificano regole complicate di gestione degli errori, ma dichiarano anche obsoleto l'attributo name in un elemento a.

Sarebbe illogico (e formalmente proibito) di utilizzare lo stesso valore id a due elementi nello stesso documento, come lo scopo, e solo scopo, di id è di fornire un unico identificatore per un elemento. Il costrutto <a name=...> precede lo id nella cronologia dell'HTML e ha sempre avuto lo stesso ruolo di id, in un'impostazione limitata. È così naturale che sia trattato allo stesso modo.