2012-05-06 5 views
5

Estoy trabajando en un sitio que está utilizando un oyente para que el hash muestre y oculte los DIV de contenido y para desplazarse al ancla con nombre del mismo nombre.Anclaje designado (A) con NAME igual que un conflicto de ID DIV

Estaba teniendo un problema extraño en el que, en lugar de desplazarse hacia el ancla, se desplazaba al DIV con el ID igual que el nombre del ancla.

Una vez que cambié el ID de DIV a algo diferente, el comportamiento fue el esperado.

Parece que no encuentro ninguna documentación sobre esto y me preguntaba si esto es un comportamiento documentado.

código que funciona:

<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> 

no funciona como se esperaba:

<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> 

En el segundo ejemplo, sería desplazarse hasta la P llamado "fondo". Del mismo modo, si hago una DIV en la parte inferior de la página con una ID de "abajo" y presiono page.html # abajo, se desplaza hacia abajo a esa DIV.

Parece confuso. ¿Una idea de por qué esto está funcionando de esta manera? Mismo comportamiento en Safari y FF.

+0

Interesante: me está costando encontrar esto en la especificación de HTML5. –

+1

Si encuentra esto en [HTML4 spec] (http://www.w3.org/TR/html401/struct/links.html#h-12.2.3): * "Los atributos' id' y 'name' comparten el mismo espacio de nombre. Esto significa que no pueden definir un ancla con el mismo nombre en el mismo documento. "*. Supongo que esto luego se redefinió en la especificación HTML5 para considerar los navegadores de comportamiento común implementados. –

Respuesta

7

id has precedence over name:

Para documentos HTML (HTML y tipos MIME), el siguiente modelo de procesamiento se deben seguir para determinar cuál es la parte indicada del documento es .

  1. analizar la URL, y vamos fragid sea el componente de la URL .

  2. Si fragid es la cadena vacía, la parte indicada del documento es la parte superior del documento; detener el algoritmo aquí.

  3. Let decodificado fragid ser el resultado de la expansión de cualquiera de las secuencias de octetos por ciento codificado en fragid que son válidos UTF-8 secuencias en caracteres Unicode como se define por UTF-8. Si alguno de los octetos porcentuales en esa cadena no son secuencias UTF-8 válidas (por ejemplo, se expanden para sustituir puntos de código), omita este paso y el siguiente .

  4. Si este paso no fue omitida y hay un elemento en el DOM que tiene un ID exactamente igual a fragid decodificada, entonces el primer tales elemento con el fin árbol es la parte indicada del documento; pare el algoritmo aquí.

  5. Si hay un elemento en el DOM que tiene un atributo de nombre cuyo valor es exactamente igual a fragid (fragid no decodificado), entonces el primero de esos elementos con el fin de árbol es la parte indicada del documento ; detener el algoritmo aquí.

  6. Si fragid es una coincidencia ASCII insensible a mayúsculas y minúsculas para la parte superior de la cadena, , entonces la parte indicada del documento es la parte superior del documento; detiene el algoritmo aquí.

  7. De lo contrario, no hay una parte indicada del documento.

+0

Supongo que nunca consideré que podría usar el hash para desplazarse a una ID o NOMBRE que no sea . Aprendí algo nuevo hoy. – Jazzy

1

El HTML 4.01 y XHTML 1.0 especificaciones requieren que un atributo de name en un elemento a no debe ser el mismo que el valor de un atributo id, excepto cuando se establece en el mismo elemento, el documento está en error. Los navegadores son libres de aplicar su propio manejo de errores, que puede ser bastante imprevisto.

Los borradores HTML5 especifican reglas de manejo de errores complicadas, pero también declaran el atributo name en un elemento a como obsoleto.

Sería ilógico (y formalmente prohibido) para utilizar el mismo valor id a dos elementos en el mismo documento, como el propósito, y el propósito único, de id es proporcionar un único identificador para un elemento. El constructo <a name=...> es anterior a id en la historia de HTML y siempre se pensó para jugar el mismo rol que id, en una configuración restringida. Por lo tanto, es natural que se trate de la misma manera.

Cuestiones relacionadas