2010-08-31 23 views
32

Wie kann ich eine Sammlung von Elementen erhalten, indem Sie ihr id Attribut angeben? Ich möchte den Namen aller Tags erhalten, die die gleiche id im HTML haben.JavaScript und getElementById für mehrere Elemente mit der gleichen ID

Ich möchte ONLY getElementById() verwenden, um eine Reihe von Elementen zu erhalten. Wie kann ich das machen?

+1

Wie kann die gleiche ID HTML-Elemente teilen? ?? Verwenden Sie stattdessen die Klasse. –

+1

Für einen legitimen Anwendungsfall kann ich JS verwenden, um Code in der Konsole auf einer Website auszuführen, die ich nicht selbst entwickelt habe. – apnorton

Antwort

3

Die ID sollte eindeutig sein, verwenden Sie stattdessen die Attribute "name" und "geteilementsbyname", und Sie haben Ihr Array.

+1

Wenn die Elemente ein Namensattribut unterstützen, die meisten nicht. Es gab einen heftigen Vorstoß, um ihn außer Formkontrollen loszuwerden. – Quentin

+0

In der Tat, aber es ist die einzige Lösung (afaik), wenn er kein js-Framework verwendet, und es wird für jedes Element funktionieren, auch wenn (gemäß w3c) das Element dieses Attribut nicht unterstützt. –

+2

Sie brauchen kein JS-Framework, um gEBCN zu verwenden, Sie können auf die Existenz der Funktion testen und dann auf eine Funktion zurückgreifen, die Elemente umläuft und deren Klassen überprüft - viele Implementierungen im Netz. – Quentin

7

Es ist illegal, mehrere Elemente mit demselben id zu haben. Die id wird als individuelle Kennung verwendet. Verwenden Sie für Elementgruppen stattdessen class und getElementsByClassName.

+0

getElementsByClassName wird derzeit nicht im IE unterstützt. – Floyd

+0

Ein Wert für 'class' sollte auch nicht zur Identifikation verwendet werden, wenn der Name ein vollkommen gültiger Ansatz ist. –

+6

Die meisten Elemente unterstützen kein Namensattribut, daher ist dies kein sehr praktischer Vorschlag. Eine Klasse ist eine Gruppe von Dingen, die etwas gemeinsam haben. Wenn jemand mit JS ein Bündel von Dingen ergattern will, müssen sie etwas gemeinsam haben. Daher ist die Klasse eine ** ausgezeichnete ** Wahl dafür. Es ist ** nicht ** ein Attribut, das ausschließlich zum Abhängen von CSS entworfen wurde. Das einzige Problem ist die eingeschränkte Browserunterstützung für getElementsByClassName, aber es gibt browserübergreifende Implementierungen (einschließlich Standalone und in YUI und jQuery) – Quentin

63

The HTML spec erforderlich, um das ID Attribut in einer Seite eindeutig zu sein:

Dieses Attribut einen Namen auf ein Element zuweist. Dieser Name muss in einem Dokument eindeutig sein.

Wenn Sie mehrere Elemente mit derselben ID haben, ist Ihr HTML nicht gültig.

So sollte getElementById() immer nur ein Element zurückgeben. Sie können nicht mehrere Elemente zurückgeben.

Es gibt ein paar verwandte Funktionen, die ein Array von Elementen zurück - getElementsByName oder getElementsByClassName, die Ihre Anforderungen besser geeignet sein können, obwohl getElementsByClassName neue 5 in HTML, die noch im Entwurf ist.

+5

Kann der Downvote bitte erklären warum? – Oded

+3

Ich wurde auch downvotiert; Ich habe meine Antwort gelöscht, da es sich effektiv um ein Duplikat handelt. Ich vermute, der Abgeordnete hat keine legitime Grundlage für seine Bedenken außer einer selbstwichtigen Meinung. –

+8

Downvote von mir auch, 'Klasse' ist semantisch besser als' Name', die hier nicht korrekt verwendet wird. Ich glaube, dass 'name' nur für' form' Elemente funktioniert. Der eigentliche Zweck von 'name' besteht darin, die Namen der Abfrageattribute zu benennen, wenn sie an den Server gesendet werden. Der einzige Zeitpunkt, an dem sie für mehrere Elemente verwendet werden sollten, ist das Gruppieren von Optionsfeldern. –

0

Sie sollten das nicht tun und selbst wenn es möglich ist, ist es nicht zuverlässig und anfällig für Probleme.

Grund ist, dass eine ID auf der Seite eindeutig ist. Sie können also nicht mehr als 1 Element auf der Seite mit derselben ID haben.

+1

Nun, Sie können mehr als ein Element mit der gleichen ID haben, aber Sie sollten nicht - und die Folgen davon ist unvorhersehbar, aufgrund von Unterschieden zwischen Browsern. Dies ist die Ursache vieler Probleme - wenn alle Browser Seiten mit doppelten ID-Attributen zurückweisen, wäre diese ganze Diskussion mehr oder weniger unnötig. (In einer idealen Welt ...) – belugabob

26

Warum Sie dies tun möchten, ist jenseits von mir, da id in einem Dokument eindeutig sein soll. Allerdings neigen Browser auf diese ziemlich lax sein, wenn Sie also wirklich getElementByld für diesen Zweck verwenden müssen, können Sie es wie folgt tun:

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

aber dieses dumme ist, und ich würde nicht trauen, dies zu arbeite für immer an allen Browsern. Obwohl die HTML-DOM-Spezifikation id als Readwrite definiert, wird sich ein validierender Browser beschweren, wenn er mehreren Elementen mit derselben ID gegenübersteht.

EDIT: Gegeben ein gültiges Dokument, könnte der gleiche Effekt dadurch erreicht werden:

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

In der Tat eine alberne Problemumgehung. Aber warum definieren Sie eine Wrapper-Funktion um 'document.getElementById' in Ihrem hinzugefügten Teil? Das ist völlig nutzlos (abgesehen von einem kürzeren Alias ​​wie $), um dasselbe zu erreichen. –

+0

Die spezifische Anforderung des OP besteht darin, eine Reihe von Elementen zu erhalten. 'document.getElementById' gibt nur ein Element (nicht in einem Array) zurück, meine Funktion' getElementsById' gibt ein Array zurück, das alle Elemente mit einer bestimmten ID in einem gültigen Dokument enthält. –

+3

+1 für die Lösung - obwohl es gegen die Spezifikation ist, ist es eine unvollkommene Welt, und ich musste dies für ein Projekt, das ich geerbt hatte, tun. – Wex

-2

können wir document.forms verwenden [0] .Controlid

+2

Eine Erklärung würde helfen. –

-2

Wenn Sie d3 verwenden mehr für den Umgang mit Objekte mit derselben Klasse/ID

Sie können eine Untergruppe von Klassenelementen entfernen, indem Sie d3.selectAll (". classname");

Zum Beispiel verwendet das Donut-Diagramm hier auf http://medcorp.co.nz Kopien eines Bogenobjekts mit dem Klassennamen "Arc" und es gibt eine einzelne Zeile von d3, d3.selectAll (". Arc").Löschen(); um all diese Objekte zu entfernen;

mit document.getElementById ("arc"). Remove(); löscht nur ein einzelnes Element und müsste mehrmals aufgerufen werden (wie bei den obigen Vorschlägen erzeugt er eine Schleife, um die Objekte n mal zu entfernen)

0

Klasse ist mehr als genug für die Verweisung von allem, was Sie wollen, weil es haben kann eine Benennung mit einem mehr Worten:

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

das ist der Weg Sie verschiedene Stile mit CSS anwenden können (und Bootstrap ist das beste Beispiel dafür) und natürlich können Sie rufen

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

ein So weiter für jede gewünschte Gruppierung.

Jetzt, im allerletzten Fall, möchten Sie wirklich Elemente nach ID gruppieren.

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

Auf diese Weise können Sie, zu wissen, die numerische ID, den Zugang und ein Element erhalten, indem nur zusätzliche nicht-entkräften numerische Zeichen hinzugefügt und ruft: Sie können eine numerisch ähnliche Elemente verwendet, aber nicht gleich ID verwenden und beziehen eine Funktion, um den ursprünglichen Index von seinem erlaubten, die Zeichenkette identifizierenden Wert zu erhalten (durch Parsing usw.). Es ist nützlich, wenn Sie:

  • Haben mehrere Zeilen mit ähnlichen Elementen und wollen ihre Veranstaltungen kohärent behandeln. Egal, ob Sie eine löschen oder fast alle von ihnen. Da die numerische Referenz immer noch vorhanden ist, können Sie sie wiederverwenden und ihr gelöschtes Format neu zuweisen.

  • Keine Klassen-, Namen- und Tagname-IDs mehr.

Obwohl Sie auch Räume und andere gemeinsame Zeichen verwenden können, wenn es sich um eine nicht Voraussetzung ist streng in Browsern validiert, ist es nicht zu empfehlen, sie zu benutzen, besonders, wenn Sie diese Daten in andere Formate wie JSON senden werden. Sie können solche Dinge sogar mit PHP handhaben, aber das ist eine schlechte Übung, die zu schmutzigen Programmierpraktiken neigt.

+0

Es gibt Anforderungen für Ids. Einer von ihnen besagt, dass IDs KEINE Leerzeichen enthalten dürfen. Weitere Informationen finden Sie hier: http://StackOverflow.com/Questions/70579/what-are-valid-values-for-the-id-Attribute-in-HTML –

+0

Allerdings ist die Anforderung in Browsern, die ich ausprobiert, tatsächlich nicht validiert (Opera, Firefox und Chrome). –

1

Wie andere gesagt haben, sollten Sie nicht die gleiche ID mehr als einmal in Ihrem HTML, aber ... Elemente mit einer ID an das Dokument Objekt angebracht und Fenster auf Internet Explorer  . Siehe:

Do DOM tree elements with ids become global variables?

Wenn mehr als ein Element mit der gleichen ID existiert in Ihrem HTML, diese Eigenschaft als Array angebracht ist. Es tut mir leid, aber ich weiß nicht, wo ich hinschauen soll, wenn dies das Standardverhalten ist oder zumindest das gleiche Verhalten zwischen Browsern, was ich bezweifle.

10

Ich weiß, dass dies eine alte Frage ist und dass eine HTML-Seite mit mehreren IDs ungültig ist. Ich stieß jedoch auf diese Probleme, während ich die HTML-Dokumentation anderer APIs, die doppelte IDs (ungültiges HTML) enthielten, neu schreiben und neu formatieren musste.

Also für alle anderen, hier ist der Code, den ich verwendet, um das Problem zu umgehen querySelectorAll mit:

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"); gibt alle Elemente, deren ID ist yourId

Verwandte Themen