Un elemento html può avere più ID?


310

Comprendo che un ID deve essere univoco all'interno di una pagina HTML / XHTML.

La mia domanda è, per un dato elemento, posso assegnargli più ID?

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

Mi rendo conto di avere una soluzione semplice usando semplicemente una classe. Sono solo curioso di usare gli ID in questo modo.


Sto programmando da un po 'di tempo in html css e js. Spesso ho bisogno di usare più classi ma non uso mai né ho bisogno di usare più ID. Tuttavia sono un po 'curioso: posso chiedere qual è la situazione che hai dovuto affrontare in tale occasione per richiedere più ID?
willy wonka,

Nel raro scenario in cui uno non ha accesso all'HTML di origine (ad esempio quando si creano proxy) se è necessario targetizzare un elemento che ha più ID, il selettore CSS [id = "uno due tre" '] dovrebbe essere indirizzato all'elemento.
JisuKim82,

Questo dipende in realtà dalle specifiche citate (e probabilmente implementate) e dal contesto in esse. cioè w3.org/TR/html5/dom.html#the-id-attribute e quello più vecchio che indica "sì"? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

1
@willywonka So che è come 2+ anni dopo, ma mi sono imbattuto in questo articolo proprio ora alla ricerca di una risposta a questo, e ho sentito di condividere lo scenario con te che mi sono imbattuto, dal momento che non hai mai avuto una risposta. Sto realizzando un progetto per Freecodecamp per creare un calcolatore JS. Vogliono che l'id per l'output sia "display" in modo da poter eseguire i loro test contro di esso, ma sto creando un calcolatore scientifico con 2 display: #input e #output, quindi il display #input necessita ANCHE dell'id "display" valore in aggiunta al valore di "input" che voglio dare per coerenza.
Tara Stahler,

1
Ciao @TaraStahler, sei il benvenuto. Per quanto ne so, il browser visualizzerà il primo solo se si utilizza la notazione <... id = "input" id = "display" ...> e anche un ID non deve contenere spazi bianchi (né tabulazioni) la notazione <... id = "input display" ...> non è affatto valida. Ho appena sperimentato javascript con la console di Chrome e restituisce "Uncaught ReferenceError: display non definito" in entrambi i casi. Solo il primo caso restituisce l'oggetto se lo ottengo con il primo ID, il secondo non è realizzabile. Nel secondo caso nessuno degli ID è realizzabile. Forse devi refactificare il tuo codice?
willy wonka,

Risposte:


205

No. Dalla specifica XHTML 1.0

In XML, gli identificatori di frammento sono di tipo ID e può esserci un solo attributo di tipo ID per elemento. Pertanto, in XHTML 1.0 l'attributo id è definito come di tipo ID. Al fine di garantire che i documenti XHTML 1.0 siano documenti XML ben strutturati, i documenti XHTML 1.0 DEVONO utilizzare l'attributo id quando si definiscono identificatori di frammenti sugli elementi sopra elencati. Consulta le Linee guida per la compatibilità HTML per informazioni su come garantire che tali ancoraggi siano compatibili con le versioni precedenti quando si forniscono documenti XHTML come tipo di supporto testo / html.


7
"Gli identificatori di frammento sono di tipo ID e può esistere un solo attributo di tipo ID per elemento." Qui dice, singolo attributo e attributo è diverso dai valori dell'attributo. Non dice ciò che i valori di attributo non dovrebbero assumere in alcun contesto multivalore attraverso lo spazio separato o qualsiasi separazione di caratteri. Sebbene nella specifica affermi che per compatibilità con le versioni precedenti non deve contenere caratteri di spazio nei valori degli attributi Identificatori di frammenti (w3.org/TR/xhtml1/#guidelines) Quindi se vuoi esprimere ID multivalore devi esprimerlo in modo diverso
Richeve Bebedor

2
Dipende dalle specifiche che citi, suppongo. "Questa specifica non preclude un elemento con più ID ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

Vedi qui dove viene rimossa quella frase w3.org/TR/html5/dom.html#the-id-attribute
Mark Schultheiss

Ok, ho fatto in modo che questa risposta raggiungesse il segno di 200 voti positivi. Va tutto bene. Mi vedrò fuori.
KhoPhi,

196

Contrariamente a quanto hanno detto tutti gli altri, la risposta corretta è

Le specifiche dei selettori sono molto chiare al riguardo:

Se un elemento ha più attributi ID, tutti devono essere trattati come ID per quell'elemento ai fini del selettore ID. Tale situazione potrebbe essere raggiunta usando miscele di xml: id, DOM3 Core, XML DTD e specifici dello spazio dei nomi conoscenza.


modificare

Giusto per chiarire: Sì, un elemento XHTML può avere più ID, ad es

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

ma non è possibile assegnare più ID allo stesso idattributo utilizzando un elenco separato da spazi.


7
Ottima risposta - ora questo ha messo il gatto tra i piccioni.
TrojanName,

3
Sfortunatamente non è la specifica CSS che è operativa qui. Per HTML / XHTML, devi guardare quella specifica e la specifica lì dice sicuramente che ogni elemento può avere al massimo un ID e che l'id deve essere unico nella pagina: w3.org/TR/html401/struct/global. html # h-7.5.2 (per HTML 4)
tvanfosson,

9
@tvanfosson: Sorprendentemente, le specifiche HTML4 NON dicono che ogni elemento può avere al massimo un ID. Se guardi le specifiche HTML5 , troverai anche che 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.(che corrisponde alle specifiche CSS)
user123444555621

1
puoi avere un solo attributo id e il formato del contenuto dell'attributo id impedisce di avere spazi. Nel contesto della domanda - dando un elemento 2 ID "HTML" - non è possibile farlo in HTML 4 o HTML 5. Stai assumendo che dargli un ID che funziona con CSS sia sufficiente per quello che sta cercando di fare, e potrebbe essere che avere un xmlid funzionerebbe, ma non vedo come lo tiri fuori dalla domanda come scritto. L'esempio che mostra non funzionerà in HTML 4 o HTML 5 e non c'è modo di farlo funzionare per realizzare ciò che viene mostrato.
tvanfosson,

6
Ho upvoted questa risposta in quanto risponde alla domanda: " possibile che si assegna più ID di un elemento?" Tuttavia, dovrei aggiungere che ciò va oltre le semplici specifiche; come indicato nella risposta accettata, quando si tratta di HTML / XHTML per sé le specifiche dice si può solo assegnare un ID utilizzando l' idattributo. Per chiarire, l' xml:idattributo (e di fatto qualsiasi attributo al di fuori dello spazio dei nomi predefinito) non è valido in XHTML. Tuttavia, come si evince dalle specifiche HTML5, ciò non causa in alcun modo errori xml:id="bar"silenziosi; aggiungerà comunque l' barID a questo elemento, permettendogli di abbinare #bar.
BoltClock

28

La mia comprensione è sempre stata:

  • Gli ID sono monouso e vengono applicati solo a un elemento ...

    • Ciascuno è attribuito come identificatore univoco a (solo) un singolo elemento .
  • Le lezioni possono essere utilizzate più di una volta ...

    • Possono quindi essere applicati a più di un elemento e, allo stesso modo, ma diversi, possono esserci più di una classe (cioè più classi) per elemento .

18
Non penso che ciò possa essere una risposta alla domanda. La domanda è: "È possibile utilizzare più ID per un singolo elemento?"
Kevin,

4
@kevin Questa risposta presuppone che OP si trovi ad affrontare un problema XY e può sicuramente aiutare qualcuno che sta cercando di ottenere il comportamento di classe tramite ID - per qualsiasi motivo.
Mahdi,

Ti riferisci al "monouso" ma ciò può causare confusione. Puoi ed è una cosa corretta e corretta usare più volte un elemento dal suo ID. Quello che penso tu stia affrontando è un'altra interpretazione che è: potresti usare un (e solo uno) id per un elemento e SOLO per quell'elemento.
Mbotet,

27

No. Mentre la definizione di w3c per HTML 4 non sembra esplicitamente coprire la tua domanda, la definizione dell'attributo name e id non dice spazi nell'identificatore:

I token ID e NAME devono iniziare con una lettera ([A-Za-z]) e possono essere seguiti da un numero qualsiasi di lettere, cifre ([0-9]), trattini ("-"), caratteri di sottolineatura ("_") , due punti (":") e punti (".").


20

No. Ogni elemento DOM, se ha un ID, ha un singolo ID univoco. Puoi approssimarlo usando qualcosa come:

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

e quindi utilizza la navigazione per ottenere ciò che desideri davvero.

Se stai solo cercando di applicare gli stili, i nomi delle classi sono migliori.


Ciò interromperebbe la convalida però.
Aupajo,

3
Cosa c'è di illegale in questa risposta? Qualcuno può spiegare il voto negativo?
potenza

19
Non me. :-) E non sono sicuro di cosa intendi per violazione della convalida? Gli ID di div e span sono diversi (racchiuso o racchiuso), quindi non vi è alcun problema con gli ID duplicati. Forse alcune persone non leggono molto da vicino.
tvanfosson,

4
Rubare una banca è illegale, un problema di software non è mai illegale. È quella vecchia realtà virtuale contro il problema della realtà reale di nuovo :-P
TrojanName

@BrianFenton il debug di qualcun altro codice mi ha fatto capire che dovrebbe essere illegale. Dico 5 anni di prigione per non aver seguito le specifiche senza una buona ragione per non farlo.
ProblemsOfSumit

18

Puoi avere un solo ID per elemento, ma puoi effettivamente avere più di una classe. Ma non avere più attributi di classe, inserisci più valori di classe in un attributo.

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

è perfettamente legale.


4

No, non puoi avere più ID per un singolo tag, ma ho visto un tag con un nameattributo e un idattributo trattati allo stesso modo da alcune applicazioni.


1
in IE, prima di IE8, sì. ma ora hanno risolto quel bug in modalità standard. getElementById () utilizzato per restituire erroneamente inseme case corrispondenti insensibilmente su nome e ID.
scunliffe,

4

No, dovresti usare DIV nidificati se vuoi seguire quel percorso. Inoltre, anche se potessi, immagina la confusione che potrebbe causare quando avvii document.getElementByID (). Quale ID prenderà se ce ne sono più?

Su un argomento leggermente correlato, è possibile aggiungere più classi a un DIV. Vedi la discussione di Eric Myers su,

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


1
Non otterrebbe l'id specificato tra parentesi? getElementById();non fa nulla senza una stringa che specifica cosa ottenere ?! getElementById('foo');otterrà l'elemento con foo come ID! Qui non contano più ID. Cercherebbe ancora "pippo".
Rin e 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'attributo id assegna un identificatore univoco a un elemento (che può essere verificato da un parser SGML).

e

I token ID e NAME devono iniziare con una lettera ([A-Za-z]) e possono essere seguiti da un numero qualsiasi di lettere, cifre ([0-9]), trattini ("-"), caratteri di sottolineatura ("_") , due punti (":") e punti (".").

Quindi "id" deve essere unico e non può contenere uno spazio.


1

Vorrei dire tecnicamente sì, dal momento che ciò che viene reso dipende tecnicamente sempre dal browser. La maggior parte dei browser cerca di attenersi alle specifiche nel miglior modo possibile e per quanto ne so non c'è nulla nelle specifiche CSS contro di esso. Garantirò solo l'effettivo codice html, css, javascript che viene inviato al browser prima che intervenga qualsiasi altro interprete.

Tuttavia dico anche di no, dato che ogni browser su cui collaudo di solito non te lo consente. Se hai bisogno di vedere tu stesso, salva quanto segue come file .html e aprilo nei principali browser. In tutti i browser che ho testato sulla funzione javascript non corrisponderà a un elemento. Tuttavia, rimuovere "hunkojunk" dal tag id e tutto funziona correttamente. Codice di esempio

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

Detto questo, non c'è nulla che possa impedirti di farlo. Ma otterrai un comportamento incoerente con i vari browser. Non farlo 1 ID per elemento.

Se vuoi più assegnazioni a un elemento usa le classi (separate da uno spazio).


0

È interessante, ma per quanto ne so la risposta è un fermo no. Non vedo perché hai bisogno di un ID nidificato, poiché di solito lo attraversi con un altro elemento che ha lo stesso ID nidificato. Se non lo fai non ha senso, se lo fai c'è ancora poco senso.


1
Mi sarebbe piaciuto usare anche 2 ID per compatibilità con le versioni precedenti. per esempio qualcosa era un articolo 8 in una versione precedente, ma ora è chiamato nodo 8 con 2 ID di un elemento che impedirebbe di codificare una soluzione alternativa per renderlo compatibile con le versioni precedenti. Mentre entrambi gli ID rimarrebbero come identificatori univoci.
VOLA

0

So che ha un anno, ma ero curioso di questo e sono sicuro che altri troveranno la loro strada qui. La semplice risposta è no, come altri hanno già detto prima di me. Un elemento non può avere più di un ID e un ID non può essere utilizzato più di una volta in una pagina. Provalo e vedrai quanto non funziona.

In risposta alla risposta di tvanfosson sull'uso dello stesso ID in due elementi diversi. Per quanto ne so, un ID può essere utilizzato solo una volta in una pagina, indipendentemente dal fatto che sia associato a un tag diverso.

Per definizione, un elemento che necessita di un ID dovrebbe essere univoco, ma se hai bisogno di due ID non è univoco e necessita invece di una classe.


1
Ma, se leggi la risposta di tvanfosson, i due ID differiscono chiaramente "enclosing_id_123"! = "Enclosed_id_123"
Ben

0

le classi sono fatte appositamente per questo, ecco il codice da cui puoi capire

<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

Non credo che tu possa avere due ID, ma dovrebbe essere possibile. Usare lo stesso ID due volte è un caso diverso ... come due persone che usano lo stesso passaporto. Tuttavia, una persona potrebbe avere più passaporti ... Sono venuto a cercarlo poiché ho una situazione in cui un singolo dipendente può avere diverse funzioni. Supponiamo che "sysadm" e "coordinatore del team" con l'id = "coordinatore del team sysadm" mi permettano di fare riferimento a loro da altre pagine in modo che dipendenti.html # sysadm e employee.html # teamcoordinator porterebbero allo stesso posto ... Un giorno qualcuno altrimenti potrebbe assumere la funzione di coordinatore del team mentre il sysadm rimane il sysadm ... quindi devo solo cambiare gli ID nella pagina dipendenti.html ... ma come ho detto - non funziona :(

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.