2010-08-31 25 views
32

Come posso ottenere una raccolta di elementi specificando l'attributo id? Voglio ottenere il nome di tutti i tag che hanno lo stesso id in html.JavaScript e getElementById per più elementi con lo stesso ID

Desidero utilizzare SOLO getElementById() per ottenere una matrice di elementi. Come posso fare questo?

+1

Come può elementi HTML condividere lo stesso ID? ?? usa invece la classe. –

+1

Per un uso legittimo, potrei utilizzare JS per eseguire codice nella console su un sito Web che non ho sviluppato personalmente. – apnorton

risposta

3

L'id dovrebbe essere univoco, utilizzare invece l'attributo "nome" e "getelementsbyname" e si avrà la matrice.

+1

Se gli elementi supportano un attributo nome, che la maggior parte no. C'è stata una forte spinta per sbarazzarsi di esso ad eccezione dei controlli di forma. – Quentin

+0

In effetti, ma è l'unica soluzione (afaik) se non usa un framework js, e funzionerà per ogni elemento anche se (secondo w3c) l'elemento non supporta questo attributo. –

+2

Non hai bisogno di un framework JS per utilizzare gEBCN, puoi testare l'esistenza della funzione e quindi eseguire il fallback su una funzione che esegue il loop su elementi e controlla le loro classi - molte implementazioni in rete. – Quentin

7

È illegale disporre di più elementi con lo stesso id. Il id viene utilizzato come identificativo individuale. Per gruppi di elementi, utilizzare invece class e getElementsByClassName.

+0

getElementsByClassName non è attualmente supportato in IE. – Floyd

+0

Un valore per 'class' non dovrebbe essere utilizzato per l'identificazione, quando il nome è un approccio perfettamente valido. –

+6

La maggior parte degli elementi non supporta un attributo nome, quindi non è un suggerimento molto pratico. Una classe è un gruppo di cose che hanno qualcosa in comune. Se qualcuno vuole afferrare un fascio di cose con JS, allora devono avere qualcosa in comune. Pertanto la classe è una scelta ** eccellente ** per questo. È ** non ** un attributo progettato esclusivamente per appendere i CSS. L'unico problema è il supporto limitato del browser per getElementsByClassName, ma esistono implementazioni cross-browser (comprese quelle indipendenti e in YUI e jQuery) – Quentin

63

Il HTML spec richiesto l'attributo ID di essere unici in una pagina:

Questo attributo assegna un nome a un elemento. Questo nome deve essere univoco in un documento.

Se si dispone di più elementi con lo stesso ID, il codice HTML non è valido.

Quindi, getElementById() deve restituire sempre un elemento. Non puoi renderlo restituire più elementi.

ci sono un paio di funzioni correlate che restituirà un array di elementi - getElementsByName, o getElementsByClassName che possono essere più adatto alle vostre esigenze, anche se getElementsByClassName è nuovo in HTML 5, che è ancora in bozza.

+5

Il downvote può spiegare perché? – Oded

+3

Sono stato anche downvoted; Ho cancellato la mia risposta in quanto è effettivamente un tuo duplicato. Sospetto che il downvoter non abbia basi legittime per le sue preoccupazioni se non un'opinione importante. –

+8

Anche da parte mia, 'classe' è semanticamente migliore di' name', che non è correttamente usato qui. Credo che 'name' funzioni solo per gli elementi' form'. Inoltre, il vero scopo di 'name' è di nominare i nomi degli attributi di query quando vengono inviati al server. L'unica volta in cui dovrebbero essere utilizzati su più elementi, è raggruppare i pulsanti di opzione. –

0

Non si dovrebbe fare questo e anche se è possibile non è affidabile e incline a causare problemi.

Il motivo è che un ID è univoco nella pagina. non puoi avere più di 1 elemento nella pagina con lo stesso ID.

+1

Bene, puoi avere più di un elemento con lo stesso ID, ma non dovresti - e le conseguenze di ciò sono imprevedibili, a causa di differenze tra i browser. Questa è la radice di molti problemi: se tutti i browser respingono pagine con attributi ID duplicati, l'intera discussione sarebbe più o meno inutile. (In un mondo ideale ...) – belugabob

26

Perché si vorrebbe fare questo è oltre me, dal momento che si suppone che id sia univoco in un documento. Tuttavia, i browser tendono ad essere piuttosto lassista su questo, quindi se proprio deve utilizzare getElementById per questo scopo, si può fare in questo modo:

function whywouldyoudothis() { 
    var n = document.getElementById("non-unique-id"); 
    var a = []; 
    var i; 
    while(n) { 
     a.push(n); 
     n.id = "a-different-id"; 
     n = document.getElementById("non-unique-id"); 
    } 

    for(i = 0;i < a.length; ++i) { 
     a[i].id = "non-unique-id";  
    } 
    return a; 
} 

Tuttavia, questo è stupido, e io non mi fiderei a questo funziona su tutti i browser per sempre. Sebbene la specifica DOM HTML definisca id come readwrite, un browser di convalida si lamenterà se si trova di fronte a più di un elemento con lo stesso id.

EDIT: Dato un documento valido, lo stesso effetto potrebbe essere ottenuto in tal modo:

function getElementsById(id) { 
    return [document.getElementById(id)]; 
} 
+0

Davvero una sciocca soluzione. Ma perché stai definendo una funzione wrapper attorno a 'document.getElementById' nella tua parte aggiunta? Questo è completamente inutile (a parte l'uso di un alias più breve come '$' per ottenere lo stesso risultato). –

+0

Il requisito specifico dell'OP è ottenere una matrice di elementi. 'document.getElementById' restituisce solo un elemento (non in un array), la mia funzione' getElementsById' restituisce un array contenente tutti gli elementi con un dato id in un documento valido. –

+3

+1 per la soluzione - nonostante sia contro le specifiche, è un mondo imperfetto, e avevo bisogno di farlo per un progetto che ho ereditato. – Wex

-2

possiamo usare document.forms [0] .Controlid

+2

Una spiegazione potrebbe aiutare. –

-2

Se si sta utilizzando d3 per la gestione multipla oggetti con la stessa classe/id

È possibile rimuovere un sottoinsieme di elementi di classe utilizzando d3.selectAll ("classname");

Ad esempio il grafico ciambella qui http://medcorp.co.nz utilizza copie di un oggetto arco con nome di classe "arco" e c'è una sola riga di d3, d3.selectAll ("arc").rimuovere(); rimuovere tutti quegli oggetti;

utilizzando document.getElementById ("arco"). Remove(); rimuove solo un singolo elemento e dovrebbe essere chiamato più volte (come con i suggerimenti precedenti crea un ciclo per rimuovere gli oggetti n volte)

0

La classe è più che sufficiente per riferirsi a qualsiasi cosa tu voglia, perché può avere una denominazione di uno dei più parole:

<input class="special use"> 
<input class="normal use"> 
<input class="no use"> 
<input class="special treatment"> 
<input class="normal treatment"> 
<input class="no special treatment"> 
<input class="use treatment"> 

questo è il modo è possibile applicare diversi stili con i CSS (e Bootstrap è il miglior esempio di esso) e, naturalmente, si può chiamare

document.getElementsByClassName("special"); 
document.getElementsByClassName("use"); 
document.getElementsByClassName("treatment"); 
document.getElementsByClassName("no"); 
document.getElementsByClassName("normal"); 

un e così via per qualsiasi gruppo di cui hai bisogno.

Ora, nell'ultimo caso si desidera raggruppare gli elementi per ID. È possibile utilizzare e fare riferimento a elementi utilizzando un numericamente simile, ma non uguale ID:

<input id=1> 
<input id="+1"> 
<input id="-1"> 
<input id="1 "> 
<input id=" 1"> 
<input id="0x1"> 
<input id="1."> 
<input id="1.0"> 
<input id="01.0"> 
<input id="001"> 

questo modo è possibile, conoscendo l'id numerico, l'accesso e ottenere un elemento da solo l'aggiunta di caratteri numerici aggiuntivi non invalidanti e chiamando una funzione per ottenere (analizzando e così via) l'indice originale dal suo valore identificativo di stringa legale. E 'utile per quando si:

  • avere diverse righe con elementi simili e desidera gestire i suoi eventi coerentemente. Non importa se ne elimini uno o lo quasi tutti. Poiché il riferimento numerico è ancora presente, è possibile riutilizzarli e riassegnare il formato eliminato.

  • A corto di identificativi di classe, nome e tagname.

Anche se è possibile utilizzare gli spazi e altri segni comuni, anche quando si tratta di un non un obbligo strettamente convalidato nei browser, non è consigliabile usarli, specialmente se avete intenzione di inviare i dati in altri formati come JSON. Si può anche gestire cose simili con PHP, ma questa è una cattiva pratica che tende a pratiche di programmazione sporche.

+0

Esistono requisiti per gli ID. Uno di loro afferma che l'ID NON DEVE contenere spazi. Ulteriori informazioni possono essere trovate qui: http://stackoverflow.com/questions/70579/what-are-valid-values-for-the-id-attribute-in-html –

+0

Tuttavia, il requisito non è effettivamente convalidato nei browser che ho provato (Opera, Firefox e Chrome). –

1

Come altri hanno detto, non dovrebbe avere lo stesso ID più di una volta nel codice HTML, tuttavia ... elementi con un ID sono attaccato al documento oggetto e per finestra su Internet Explorer  . Fare riferimento a:

Do DOM tree elements with ids become global variables?

Se più di un elemento con lo stesso ID esiste nel codice HTML, questa proprietà è attaccato come un array. Mi dispiace, ma non so dove cercare se questo è il comportamento standard o almeno si ottiene lo stesso comportamento tra i browser, cosa di cui dubito.

10

So che questa è una vecchia domanda e che una pagina HTML con più ID non è valida. Tuttavia, mi sono imbattuto in questi problemi mentre avevo bisogno di raschiare e riformattare la documentazione HTML dell'API di qualcun altro che conteneva ID duplicati (HTML non valido).

Quindi, per chiunque altro, ecco il codice che ho usato per aggirare il problema utilizzando querySelectorAll:

var elms = document.querySelectorAll("[id='duplicateID']"); 

for(var i = 0; i < elms.length; i++) 
    elms[i].style.display='none'; // <-- whatever you need to do here. 
2

document.querySelectorAll("#yourId"); restituisce tutti gli elementi il ​​cui ID è yourId

Problemi correlati