¿Puede un elemento html tener múltiples identificadores?


310

Entiendo que una identificación debe ser única dentro de una página HTML / XHTML.

Mi pregunta es, para un elemento dado, ¿puedo asignarle múltiples identificadores?

<div id="nested_element_123 task_123"></div>

Me doy cuenta de que tengo una solución fácil simplemente usando una clase. Tengo curiosidad por usar los identificadores de esta manera.


Estoy programando casi por un tiempo en html css y js. Frecuentemente tengo la necesidad de usar varias clases pero realmente nunca uso ni tengo la necesidad de usar múltiples ID. Sin embargo, tengo un poco de curiosidad: ¿puedo preguntar cuál es la situación que enfrentó en tal ocasión para necesitar múltiples ID?
willy wonka

En el raro escenario en el que uno no tiene acceso al código fuente HTML (por ejemplo, al construir proxies) si necesita apuntar a un elemento que tiene múltiples identificadores, el selector css [id = "one two three" '] debería apuntar al elemento.
JisuKim82

Esto realmente depende de la especificación citada (y probablemente implementada) y del contexto en ella. es decir, w3.org/TR/html5/dom.html#the-id-attribute y el anterior que indica "sí"? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

1
@willywonka Sé que esto es más de 2 años después, pero me encontré con este artículo en este momento en busca de una respuesta a esto, y tuve ganas de compartir el escenario con usted que encontré, ya que nunca recibió una respuesta. Estoy haciendo un proyecto para freecodecamp para crear una calculadora JS. Quieren que el ID de la salida sea "display" para poder ejecutar sus pruebas contra él, pero estoy creando una calculadora científica con 2 pantallas: #input y #output, por lo que la #input display TAMBIÉN necesita el "display" id valor además del valor de "input" Quiero darle coherencia.
Tara Stahler

1
Hola @TaraStahler , de nada . Hasta donde yo sé, el navegador solo mostrará el primero si usa la notación <... id = "input" id = "display" ...> y también una identificación no debe contener espacios en blanco (ni pestañas) así que la notación <... id = "input display" ...> no es válida en absoluto. Acabo de experimentar con javascript con la consola de Chrome y devuelve "Error de referencia no capturado: la pantalla no está definida" en ambos casos. Solo el primer caso devuelve el objeto si lo obtengo con la primera identificación, el segundo no se puede lograr. En el segundo caso, ninguno de los identificadores es alcanzable. ¿Quizás necesites refactorizar tu código?
willy wonka

Respuestas:


205

No. De la especificación XHTML 1.0

En XML, los identificadores de fragmentos son de tipo ID, y solo puede haber un único atributo de tipo ID por elemento. Por lo tanto, en XHTML 1.0, el atributo id se define como de tipo ID. Para garantizar que los documentos XHTML 1.0 sean documentos XML bien estructurados, los documentos XHTML 1.0 DEBEN usar el atributo id al definir identificadores de fragmentos en los elementos enumerados anteriormente. Consulte las Pautas de compatibilidad de HTML para obtener información sobre cómo garantizar que dichos anclajes sean compatibles con versiones anteriores cuando sirva documentos XHTML como texto de tipo multimedia / html.


77
"los identificadores de fragmentos son de tipo ID y solo puede haber un único atributo de tipo ID por elemento". Aquí dice que el atributo único y el atributo son diferentes de los valores del atributo. No dice lo que los valores de los atributos no deben, en ningún contexto, supone valores múltiples, ya sea a través del espacio separado o de cualquier separación de caracteres. Aunque en la especificación dice que para la compatibilidad con versiones anteriores no debe contener caracteres de espacio en los valores de los atributos Fragment Identifiers (w3.org/TR/xhtml1/#guidelines) Entonces, si desea expresar ID multivalor, debe expresarlo de manera diferente
Richeve Bebedor

2
Depende de la especificación que cites, supongo. "Esta especificación no excluye que un elemento tenga múltiples ID ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

Vea aquí dónde se elimina esa oración w3.org/TR/html5/dom.html#the-id-attribute
Mark Schultheiss

Bien, hice que esta respuesta alcanzara la marca de 200 votos a favor. Esta bien. Me voy a ver afuera.
KhoPhi

196

Contrariamente a lo que todos los demás dijeron, la respuesta correcta es

La especificación de Selectores es muy clara al respecto:

Si un elemento tiene múltiples atributos de ID, todos ellos deben tratarse como ID para ese elemento a los efectos del selector de ID. Se podría llegar a tal situación utilizando mezclas de xml: id, DOM3 Core, DTD XML y espacio de nombres específico conocimiento.


Editar

Solo para aclarar: Sí, un elemento XHTML puede tener múltiples identificadores, por ejemplo

<p id="foo" xml:id="bar">

pero idno es posible asignar múltiples identificadores al mismo atributo usando una lista separada por espacios.


77
Gran respuesta: ahora eso pone al gato entre las palomas.
TrojanName

3
Desafortunadamente, no es la especificación CSS la que está operativa aquí. Para HTML / XHTML, debe mirar esa especificación y la especificación allí definitivamente dice que cada elemento puede tener como máximo una identificación y esa identificación debe ser única en la página: w3.org/TR/html401/struct/global. html # h-7.5.2 (para HTML 4)
tvanfosson

99
@tvanfosson: Sorprendentemente, la especificación HTML4 NO dice que cada elemento puede tener como máximo una identificación. Si observa las especificaciones HTML5 , incluso encontrará eso This specification doesn't preclude an element having multiple IDs, if other mechanisms (e.g. DOM Core methods) can set an element's ID in a way that doesn't conflict with the id attribute.(que corresponde a las especificaciones CSS)
usuario123444555621

1
solo puede tener un atributo de identificación y el formato del contenido del atributo de identificación impide tener espacios. En el contexto de la pregunta (dar un elemento 2 "ID" HTML), no es posible hacer esto ni en HTML 4 ni en HTML 5. Está asumiendo que darle un ID que funcione con CSS es suficiente para lo que está tratando de hacer, y puede ser que tener un xmlid funcione, pero no veo cómo sacar eso de la pregunta tal como está escrita. El ejemplo que muestra no funcionará ni en HTML 4 ni en HTML 5 y no hay forma de hacerlo funcionar para lograr lo que se muestra.
tvanfosson

66
Voté esta respuesta al responder la pregunta: " ¿ puedes asignar múltiples ID a un elemento?" Sin embargo, debo agregar que esto va más allá de las meras especificaciones; como se muestra en la respuesta aceptada, cuando se trata de HTML / XHTML en sí, la especificación dice que solo puede asignar una ID usando el idatributo. Para aclarar, el xml:idatributo (y, de hecho, cualquier atributo fuera del espacio de nombres predeterminado) no es válido en XHTML. Sin embargo, como usted cita de la especificación HTML5, esto de ninguna manera hace xml:id="bar"que falle silenciosamente; seguirá agregando la barID a este elemento, permitiéndole coincidir #bar.
BoltClock

28

Mi comprensión siempre ha sido:

  • Los ID son de un solo uso y solo se aplican a un elemento ...

    • Cada uno se atribuye como un Identificador único a (solo) un solo elemento .
  • Las clases se pueden usar más de una vez ...

    • Por lo tanto, se pueden aplicar a más de un elemento , y de manera similar pero diferente, puede haber más de una clase (es decir, varias clases) por elemento .

18
No creo que esto califique para ser una respuesta a la pregunta. La pregunta es: "¿Se pueden usar múltiples ID para un solo elemento?"
Kevin

44
@kevin Esta respuesta asume que OP enfrenta un problema XY y definitivamente puede ayudar a alguien que está tratando de lograr el comportamiento de la clase a través de ID, por cualquier razón.
Mahdi

Se refiere al "uso único" pero eso puede causar confusión. Puede y es una cosa frecuente y correcta usar varias veces un elemento por su id. Lo que creo que está abordando es otra interpretación que es: debería usar una identificación (y solo una) para un elemento y SOLO para ese elemento.
Mbotet

27

No. Si bien la definición de w3c para HTML 4 no parece cubrir explícitamente su pregunta, la definición del atributo de nombre e id dice que no hay espacios en el identificador:

Los tokens de ID y NAME deben comenzar con una letra ([A-Za-z]) y pueden ir seguidos de cualquier número de letras, dígitos ([0-9]), guiones ("-"), guiones bajos ("_") , dos puntos (":") y puntos (".").


20

No. Cada elemento DOM, si tiene una identificación, tiene una identificación única y única. Puedes aproximarlo usando algo como:

<div id='enclosing_id_123'><span id='enclosed_id_123'></span></div>

y luego usa la navegación para obtener lo que realmente quieres.

Si solo está buscando aplicar estilos, los nombres de clase son mejores.


Sin embargo, eso rompería la validación.
Aupajo

3
¿Qué tiene de ilegal esta respuesta? ¿Alguien puede explicar el voto negativo?
tpower

19
Yo no. :-) ¿Y no estoy seguro de lo que quieres decir con romper la validación? Los identificadores de div y span son diferentes (adjuntos vs. adjuntos), por lo que no hay problemas con identificadores duplicados. Quizás algunas personas no leen muy de cerca.
tvanfosson

44
Robar un banco es ilegal, un problema de software nunca es ilegal. Es ese viejo problema de realidad virtual versus realidad real nuevamente
:-P

@BrianFenton depurando el código de otra persona me hizo darme cuenta de que debería ser ilegal. Digo 5 años de prisión por no seguir las especificaciones sin una buena razón para no hacerlo.
ProblemsOfSumit

18

Solo puede tener una ID por elemento, pero puede tener más de una clase. Pero no tenga múltiples atributos de clase, ponga múltiples valores de clase en un atributo.

<div id="foo" class="bar baz bax">

Es perfectamente legal.


4

No, no puede tener múltiples identificadores para una sola etiqueta, pero he visto una etiqueta con un nameatributo y un idatributo que algunas aplicaciones tratan de la misma manera.


1
en IE, antes de IE8, sí. pero han solucionado ese error en modo estándar ahora. getElementById () se usa para devolver incorrectamente elementos que coinciden con mayúsculas y minúsculas en nombre e id.
scunliffe

4

No, debe usar DIV anidados si desea avanzar por ese camino. Además, incluso si pudiera, imagine la confusión que causaría al ejecutar document.getElementByID (). ¿Qué identificación va a tomar si hay varias?

En un tema ligeramente relacionado, puede agregar varias clases a un DIV. Ver la discusión de Eric Myers en,

http://meyerweb.com/eric/articles/webrev/199802a.html


1
¿No obtendría la identificación que especifica entre paréntesis? getElementById();¿No hace nada sin una cadena que especifica qué obtener? getElementById('foo');¡obtendrá el elemento con foo como ID! Las identificaciones múltiples no importarían aquí. Todavía buscaría "foo".
Rin y Len el

3
Any ID assigned to a div element is unique.
However, you can assign multiple IDs "under", and not "to" a div element.
In that case, you have to represent those IDs as <span></span> IDs.

Say, you want two links in the same HTML page to point to the same div element in  the page.

The two different links
<p><a href="#exponentialEquationsCalculator">Exponential Equations</a></p>         

<p><a href="#logarithmicExpressionsCalculator"><Logarithmic Expressions</a></p>

Point to the same section of the page. 
<!-- Exponential / Logarithmic Equations Calculator -->
<div class="w3-container w3-card white w3-margin-bottom">      
   <span id="exponentialEquationsCalculator"></span>
   <span id="logarithmicEquationsCalculator"></span>
</div>

2

http://www.w3.org/TR/REC-html40/struct/global.html#h-7.5.2

El atributo id asigna un identificador único a un elemento (que puede ser verificado por un analizador SGML).

y

Los tokens de ID y NAME deben comenzar con una letra ([A-Za-z]) y pueden ir seguidos de cualquier número de letras, dígitos ([0-9]), guiones ("-"), guiones bajos ("_") , dos puntos (":") y puntos (".").

Entonces "id" debe ser único y no puede contener un espacio.


1

Me gustaría decir técnicamente que sí, ya que realmente lo que se procesa depende técnicamente del navegador. La mayoría de los navegadores intentan cumplir con las especificaciones lo mejor que pueden y, por lo que sé, no hay nada en las especificaciones de CSS en su contra. Solo voy a garantizar el código html, css, javascript real que se envía al navegador antes de que intervenga cualquier otro intérprete.

Sin embargo, también digo que no, ya que cada navegador en el que normalmente pruebo no te deja. Si necesita verlo usted mismo, guarde lo siguiente como un archivo .html y ábralo en los principales navegadores. En todos los navegadores que probé en la función javascript no coincidirá con un elemento. Sin embargo, elimine "hunkojunk" de la etiqueta de identificación y todo funcionará bien. Código de muestra

<html>
<head>
</head>
<body>
    <p id="hunkojunk1 hunkojunk2"></p>

<script type="text/javascript">
    document.getElementById('hunkojunk2').innerHTML = "JUNK JUNK JUNK JUNK JUNK JUNK";
</script>
</body>
</html>

1

No.

Dicho esto, no hay nada que te impida hacerlo. Pero obtendrá un comportamiento inconsistente con los distintos navegadores. No lo hagas 1 ID por elemento.

Si desea asignaciones múltiples a un elemento, use clases (separadas por un espacio).


0

Eso es interesante, pero que yo sepa, la respuesta es un no rotundo. No veo por qué necesita una ID anidada, ya que generalmente la cruzará con otro elemento que tenga la misma ID anidada. Si no lo hace, no tiene sentido, si lo hace todavía hay muy poco punto.


1
Me hubiera gustado usar 2 id's también para compatibilidad con versiones anteriores. por ejemplo, algo que solía ser el artículo 8 en una versión anterior, pero ahora se llama nodo 8, tener 2 identificadores de un elemento evitaría la codificación de una solución alternativa para que sea compatible con versiones anteriores. Si bien ambas ID seguirían siendo un identificador único.
VUELO

0

Sé que esto tiene un año pero tenía curiosidad sobre esto y estoy seguro de que otros encontrarán su camino aquí. La respuesta simple es no, como otros han dicho antes que yo. Un elemento no puede tener más de una ID y una ID no se puede usar más de una vez en una página. Pruébalo y verás lo bien que no funciona.

En respuesta a la respuesta de tvanfosson con respecto al uso de la misma ID en dos elementos diferentes. Hasta donde sé, una ID solo se puede usar una vez en una página, independientemente de si está adjunta a una etiqueta diferente.

Por definición, un elemento que necesita una ID debe ser único, pero si necesita dos ID, entonces no es realmente único y necesita una clase en su lugar.


1
Pero, si lee la respuesta de tvanfosson, las dos identificaciones difieren claramente "enclosing_id_123"! = "Enclosed_id_123"
Ben

0

Las clases están especialmente hechas para esto, aquí está el código desde el cual puedes entender

<html>
<head>
    <style type="text/css">
     .personal{
            height:100px;
            width: 100px;   

        }
    .fam{
            border: 2px solid #ccc;
        }   
    .x{
            background-color:#ccc;
        }   

    </style>
</head>
<body>

    <div class="personal fam x"></div>

</body> 
</html>



-4

No creo que puedas tener dos Id´s pero debería ser posible. Usar la misma identificación dos veces es un caso diferente ... como dos personas que usan el mismo pasaporte. Sin embargo, una persona podría tener varios pasaportes ... Llegué a buscar esto ya que tengo una situación en la que un solo empleado puede tener varias funciones. Digamos "sysadm" y "coordinador del equipo" teniendo el id = "sysadm teamcoordinator" me permitiría hacer referencia a ellos desde otras páginas para que employee.html # sysadm and employee.html # teamcoordinator conduzca al mismo lugar ... Un día alguien de lo contrario, podría hacerse cargo de la función de coordinador del equipo mientras el sysadm sigue siendo el sysadm ... entonces solo tengo que cambiar los identificadores en la página employee.html ... pero como dije, no funciona :(

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.