Un élément html peut-il avoir plusieurs identifiants?


311

Je comprends qu'un identifiant doit être unique dans une page HTML / XHTML.

Ma question est, pour un élément donné, puis-je lui attribuer plusieurs identifiants?

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

Je me rends compte que j'ai une solution facile à utiliser simplement une classe. Je suis simplement curieux d'utiliser les identifiants de cette manière.


Je programme presque depuis un moment en html css et js J'ai souvent besoin d'utiliser plusieurs classes mais je n'utilise vraiment jamais ni j'ai besoin d'utiliser plusieurs ID. Néanmoins, je suis un peu curieux: puis-je demander quelle est la situation à laquelle vous avez dû faire face dans une telle occasion pour avoir besoin de plusieurs identifiants?
willy wonka

Dans le cas rare où l'on n'a pas accès au code HTML source (par exemple lors de la construction de proxys) si vous devez cibler un élément qui a plusieurs identifiants, le sélecteur css [id = "one two three" '] doit cibler l'élément.
JisuKim82

Cela dépend vraiment de la spécification citée (et probablement implémentée) et du contexte qu'elle contient. c'est-à-dire w3.org/TR/html5/dom.html#the-id-attribute et l'ancien qui indique "oui"? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

1
@willywonka Je sais que cela fait environ 2 ans plus tard, mais je suis tombé sur cet article tout à l'heure à la recherche d'une réponse à cette question, et j'avais envie de partager le scénario avec vous que j'ai rencontré, car vous n'avez jamais obtenu de réponse. Je fais un projet pour freecodecamp pour créer une calculatrice JS. Ils veulent que l'ID de la sortie soit "display" afin qu'ils puissent exécuter leurs tests contre elle, mais je crée une calculatrice scientifique avec 2 affichages: #input et #output, donc l'affichage #input a également besoin de l'ID "display" valeur en plus de la valeur de "input" je veux lui donner pour cohérence.
Tara Stahler

1
Salut @TaraStahler vous êtes les bienvenus. Pour autant que je sache, le navigateur ne rendra le premier que si vous utilisez la notation <... id = "input" id = "display" ...> et aussi un id ne doit pas contenir d'espaces blancs (ni tabulations) donc la notation <... id = "input display" ...> n'est pas du tout valide. Je viens d'expérimenter avec javascript avec la console Chrome et il renvoie "Uncaught ReferenceError: l'affichage n'est pas défini" dans les deux cas. Seul le premier cas renvoie l'objet si je l'obtiens avec le premier id, le second n'est pas réalisable. Dans le deuxième cas, aucun des identifiants n'est réalisable. Vous avez peut-être besoin de refactoriser votre code?
willy wonka

Réponses:


206

Non. D'après la spécification XHTML 1.0

En XML, les identificateurs de fragments sont de type ID, et il ne peut y avoir qu'un seul attribut de type ID par élément. Par conséquent, dans XHTML 1.0, l'attribut id est défini comme étant de type ID. Afin de garantir que les documents XHTML 1.0 sont des documents XML bien structurés, les documents XHTML 1.0 DOIVENT utiliser l'attribut id lors de la définition des identificateurs de fragment sur les éléments répertoriés ci-dessus. Consultez les directives de compatibilité HTML pour plus d'informations sur la compatibilité ascendante de ces ancres lors de la diffusion de documents XHTML au format texte / html.


7
"les identifiants de fragment sont de type ID, et il ne peut y avoir qu'un seul attribut de type ID par élément." Il est dit ici que l'attribut unique et l'attribut sont différents des valeurs d'attribut. Il ne dit pas ce que les valeurs d'attribut ne devraient en aucun cas supposer à plusieurs valeurs, soit par séparation d'espace, soit par séparation de caractères. Bien que dans la spécification, il indique que pour la compatibilité descendante, il ne doit pas contenir de caractère espace dans les valeurs d'attribut Identificateurs de fragment (w3.org/TR/xhtml1/#guidelines) Donc, si vous voulez exprimer des ID à plusieurs
valeurs,

2
Cela dépend des spécifications que vous citez, je suppose. "Cette spécification n'empêche pas un élément ayant plusieurs ID ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

Voir ici où cette phrase est supprimée w3.org/TR/html5/dom.html#the-id-attribute
Mark Schultheiss

D'accord, j'ai fait que cette réponse atteigne la barre des 200 votes positifs. C'est d'accord. Je vais me voir.
KhoPhi

196

Contrairement à ce que tout le monde a dit, la bonne réponse est OUI

La spécification des sélecteurs est très claire à ce sujet:

Si un élément a plusieurs attributs ID, ils doivent tous être traités comme des ID pour cet élément aux fins du sélecteur d'ID. Une telle situation pourrait être atteinte en utilisant des mélanges de xml: id, DOM3 Core, DTD XML et spécifiques à l'espace de noms connaissance.


Éditer

Juste pour clarifier: oui, un élément XHTML peut avoir plusieurs identifiants, par exemple

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

mais l'attribution de plusieurs identifiants au même idattribut à l'aide d'une liste séparée par des espaces n'est pas possible.


7
Excellente réponse - c'est maintenant que le chat est parmi les pigeons.
TrojanName

3
Malheureusement, ce n'est pas la spécification CSS qui est opérationnelle ici. Pour HTML / XHTML, vous devez regarder cette spécification et la spécification indique clairement que chaque élément peut avoir au plus un identifiant et cet identifiant doit être unique sur la page: w3.org/TR/html401/struct/global. html # h-7.5.2 (pour HTML 4)
tvanfosson

9
@tvanfosson: Étonnamment, la spécification HTML4 NE dit PAS que chaque élément peut avoir au plus un identifiant. Si vous regardez les spécifications HTML5 , vous trouverez même que 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.(ce qui correspond aux spécifications CSS)
user123444555621

1
vous ne pouvez avoir qu'un seul attribut id et le format du contenu de l'attribut id empêche d'avoir des espaces. Dans le contexte de la question - donner un élément 2 "HTML" ids - il n'est pas possible de le faire dans HTML 4 ou HTML 5. Vous faites l'hypothèse que lui donner un identifiant qui fonctionne avec CSS est suffisant pour ce qu'il essaie de faire, et il se peut que le fait d'avoir un xmlid fonctionne, mais je ne vois pas comment vous en sortirez la question telle qu'elle est écrite. L'exemple qu'il montre ne fonctionnera pas en HTML 4 ou HTML 5 et il n'y a aucun moyen de le faire fonctionner pour accomplir ce qui est montré.
tvanfosson

6
J'ai surévalué cette réponse car elle répond à la question: " pouvez- vous attribuer plusieurs ID à un élément?" Cependant, je dois ajouter que cela va au-delà des simples spécifications; comme indiqué dans la réponse acceptée, en ce qui concerne HTML / XHTML lui-même, la spécification indique que vous ne pouvez attribuer un ID qu'en utilisant l' idattribut. Pour clarifier, l' xml:idattribut (et en fait, tout attribut en dehors de l'espace de noms par défaut) n'est pas valide en XHTML. Cependant, comme vous le citez à partir de la spécification HTML5, cela n'entraîne en aucun cas une xml:id="bar"défaillance silencieuse; il ajoutera toujours l' barID à cet élément, lui permettant de correspondre #bar.
BoltClock

28

Ma compréhension a toujours été:

  • Les identifiants sont à usage unique et ne sont appliqués qu'à un seul élément ...

    • Chacun est attribué en tant qu'identifiant unique à (un seul) élément unique .
  • Les cours peuvent être utilisés plusieurs fois ...

    • Ils peuvent donc être appliqués à plus d'un élément , et de manière similaire mais différente, il peut y avoir plus d'une classe (c'est-à-dire plusieurs classes) par élément .

18
Je ne pense pas que cela puisse être considéré comme une réponse à la question. La question est: "plusieurs ID peuvent-ils être utilisés pour un seul élément?"
Kevin

4
@kevin Cette réponse suppose que OP est confronté à un problème XY et peut certainement aider quelqu'un qui essaie de réaliser le comportement de la classe via des ID - pour une raison quelconque.
Mahdi

Vous parlez de "usage unique" mais cela peut prêter à confusion. Vous pouvez et est une chose frecuent et correcte utiliser plusieurs fois un élément par son identifiant. Ce que je pense que vous abordez est une autre interprétation qui est: vous devriez utiliser un (et un seul) id pour un élément et UNIQUEMENT pour cet élément.
Mbotet

27

Non. Bien que la définition de w3c pour HTML 4 ne semble pas couvrir explicitement votre question, la définition de l'attribut name et id ne dit aucun espace dans l'identifiant:

Les jetons ID et NAME doivent commencer par une lettre ([A-Za-z]) et peuvent être suivis de n'importe quel nombre de lettres, chiffres ([0-9]), tirets ("-"), traits de soulignement ("_") , les deux-points (":") et les points (".").


20

Non. Chaque élément DOM, s'il a un identifiant, a un identifiant unique et unique. Vous pouvez l'approcher en utilisant quelque chose comme:

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

puis utilisez la navigation pour obtenir ce que vous voulez vraiment.

Si vous cherchez simplement à appliquer des styles, les noms de classe sont meilleurs.


Cela romprait cependant la validation.
Aupajo

3
Qu'est-ce qui est illégal dans cette réponse? Quelqu'un peut-il expliquer le vote négatif?
tpower

19
Pas moi. :-) Et je ne sais pas ce que tu veux dire par rupture de validation? Les identifiants de div et span diffèrent (englobant ou enfermé), il n'y a donc aucun problème avec les identifiants en double. Peut-être que certaines personnes ne lisent pas de très près.
tvanfosson

4
Voler une banque est illégal, un problème logiciel n'est jamais illégal. C'est à nouveau cet ancien problème de réalité virtuelle par rapport à la réalité :-P
TrojanName

@BrianFenton le débogage du code de quelqu'un d'autre m'a fait réaliser qu'il devrait être illégal. Je dis 5 ans de prison pour ne pas avoir suivi les spécifications sans une bonne raison de ne pas le faire.
ProblemsOfSumit

18

Vous ne pouvez avoir qu'un seul ID par élément, mais vous pouvez en effet avoir plus d'une classe. Mais ne pas avoir plusieurs attributs de classe, mettez plusieurs valeurs de classe dans un seul attribut.

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

est parfaitement légal.


4

Non, vous ne pouvez pas avoir plusieurs identifiants pour une seule balise, mais j'ai vu une balise avec un nameattribut et un idattribut qui sont traités de la même manière par certaines applications.


1
dans IE, avant IE8, oui. mais ils ont corrigé ce bug en mode standard maintenant. getElementById () utilisé pour renvoyer de manière incorrecte la casse de correspondance des éléments sur le nom et l'id.
scunliffe

4

Non, vous devez utiliser des DIV imbriqués si vous souhaitez emprunter ce chemin. En outre, même si vous le pouviez, imaginez la confusion que cela provoquerait lorsque vous exécutez document.getElementByID (). Quel ID va-t-il récupérer s'il y en a plusieurs?

Sur un sujet légèrement lié, vous pouvez ajouter plusieurs classes à un DIV. Voir la discussion d'Eric Myers sur,

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


1
N'obtiendrait-il pas l'ID que vous spécifiez entre les parenthèses? getElementById();ne fait rien sans une chaîne spécifiant quoi obtenir?! getElementById('foo');obtiendra l'élément avec foo comme ID! Plusieurs identifiants n'auraient pas d'importance ici. Il chercherait toujours "foo".
Rin et Len

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

L'attribut id attribue un identifiant unique à un élément (qui peut être vérifié par un analyseur SGML).

et

Les jetons ID et NAME doivent commencer par une lettre ([A-Za-z]) et peuvent être suivis de n'importe quel nombre de lettres, chiffres ([0-9]), tirets ("-"), traits de soulignement ("_") , les deux-points (":") et les points (".").

Donc, "id" doit être unique et ne peut pas contenir d'espace.


1

J'aimerais dire techniquement oui, car ce qui est rendu dépend toujours techniquement du navigateur. La plupart des navigateurs essaient de respecter les spécifications du mieux qu'ils peuvent et pour autant que je sache, il n'y a rien dans les spécifications CSS contre cela. Je vais seulement me porter garant du code HTML, CSS, Javascript réel qui est envoyé au navigateur avant que tout autre interprète n'intervienne.

Cependant, je dis également non, car chaque navigateur sur lequel je teste généralement ne vous permet pas. Si vous avez besoin de voir par vous-même, enregistrez ce qui suit en tant que fichier .html et ouvrez-le dans les principaux navigateurs. Dans tous les navigateurs que j'ai testés, la fonction javascript ne correspondra pas à un élément. Cependant, supprimez soit "hunkojunk" de la balise id et tout fonctionne bien. Exemple de code

<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

Non.

Cela dit, rien ne vous empêche de le faire. Mais vous obtiendrez un comportement incohérent avec les différents navigateurs. Ne le fais pas. 1 ID par élément.

Si vous voulez plusieurs affectations à un élément, utilisez des classes (séparées par un espace).


0

C'est intéressant, mais pour autant que je sache, la réponse est non. Je ne vois pas pourquoi vous avez besoin d'un ID imbriqué, car vous le croiserez généralement avec un autre élément qui a le même ID imbriqué. Si vous ne le faites pas, cela ne sert à rien, si vous le faites, il y a encore très peu de points.


1
J'aurais aimé utiliser également 2 identifiants pour une compatibilité descendante. par exemple, quelque chose était l'article-8 dans une version précédente, mais est maintenant appelé node-8, ayant 2 id d'un élément empêcherait le codage d'une solution de contournement pour la rendre rétrocompatible. Alors que les deux identifiants resteraient un ou des identifiants uniques.
FLY

0

Je sais que cela fait un an mais j'étais moi-même curieux à ce sujet et je suis sûr que d'autres trouveront leur chemin ici. La réponse simple est non, comme d'autres l'ont dit avant moi. Un élément ne peut pas avoir plus d'un ID et un ID ne peut pas être utilisé plus d'une fois dans une page. Essayez-le et vous verrez à quel point cela ne fonctionne pas .

En réponse à la réponse de tvanfosson concernant l'utilisation du même identifiant dans deux éléments différents. Pour autant que je sache, un ID ne peut être utilisé qu'une seule fois dans une page, qu'il soit attaché à une autre balise.

Par définition, un élément nécessitant un ID doit être unique, mais si vous avez besoin de deux ID, il n'est pas vraiment unique et a plutôt besoin d'une classe.


1
Mais, si vous lisez la réponse de tvanfosson, les deux identifiants diffèrent clairement "enfermant_id_123"! = "Enfermé_id_123"
Ben

0

les cours sont spécialement conçus pour cela, voici le code à partir duquel vous pouvez comprendre

<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

Je ne pense pas que vous puissiez avoir deux identifiants, mais cela devrait être possible. Utiliser le même identifiant deux fois est un cas différent ... comme deux personnes utilisant le même passeport. Cependant, une personne pourrait avoir plusieurs passeports ... Je suis venu à la recherche de cela car j'ai une situation où un seul employé peut avoir plusieurs fonctions. Disons que "sysadm" et "team coordinator" ayant l'id = "sysadm teamcoordinator" me permettraient de les référencer à partir d'autres pages afin que employee.html # sysadm et employees.html # teamcoordinator mènent au même endroit ... Un jour, quelqu'un d'autre pourrait prendre en charge la fonction de coordinateur d'équipe tandis que le sysadm reste le sysadm ... alors je n'ai qu'à changer les identifiants sur la page Employees.html ... mais comme je l'ai dit - cela ne fonctionne pas :(

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.