Es sollte nur ein Element mit einer bestimmten ID geben. Wenn Sie mit dieser Situation nicht weiterkommen, finden Sie in der zweiten Hälfte meiner Antwort Optionen.
Wie sich ein Browser verhält, wenn Sie mehrere Elemente mit derselben ID (unzulässiges HTML) haben, wird nicht durch die Spezifikation definiert. Sie können alle Browser testen und herausfinden, wie sie sich verhalten. Es ist jedoch nicht ratsam, diese Konfiguration zu verwenden oder sich auf ein bestimmtes Verhalten zu verlassen.
Verwenden Sie Klassen, wenn mehrere Objekte dieselbe Kennung haben sollen.
<div>
<span class="a">1</span>
<span class="a">2</span>
<span>3</span>
</div>
$(function() {
var w = $("div");
console.log($(".a").length);
console.log($("body .a").length);
console.log($(".a", w).length);
});
Wenn Sie Elemente mit identischen IDs zuverlässig betrachten möchten, weil Sie das Dokument nicht reparieren können, müssen Sie Ihre eigene Iteration durchführen, da Sie sich nicht auf eine der integrierten DOM-Funktionen verlassen können.
Sie könnten dies so tun:
function findMultiID(id) {
var results = [];
var children = $("div").get(0).children;
for (var i = 0; i < children.length; i++) {
if (children[i].id == id) {
results.push(children[i]);
}
}
return(results);
}
Oder mit jQuery:
$("div *").filter(function() {return(this.id == "a");});
jQuery-Arbeitsbeispiel: http://jsfiddle.net/jfriend00/XY2tX/ .
Warum Sie unterschiedliche Ergebnisse erhalten, hängt mit der internen Implementierung des Codes zusammen, der die eigentliche Auswahloperation ausführt. In jQuery können Sie den Code studieren, um herauszufinden, was eine bestimmte Version getan hat. Da es sich jedoch um illegales HTML handelt, gibt es keine Garantie dafür, dass es im Laufe der Zeit gleich bleibt. Nach dem, was ich in jQuery gesehen habe, wird zuerst überprüft, ob der Selektor eine einfache ID ist #a
und wenn ja, nur verwendet document.getElementById("a")
. Wenn der Selektor komplexer als dieser ist und querySelectorAll()
vorhanden ist, gibt jQuery den Selektor häufig an die integrierte Browserfunktion weiter, die eine für diesen Browser spezifische Implementierung hat. WennquerySelectorAll()
existiert nicht, dann wird die Sizzle-Selector-Engine verwendet, um den Selektor manuell zu finden, der eine eigene Implementierung hat. Sie können also mindestens drei verschiedene Implementierungen in derselben Browserfamilie haben, abhängig von der genauen Auswahl und der Neuheit des Browsers. Dann haben einzelne Browser alle ihre eigenen querySelectorAll()
Implementierungen. Wenn Sie mit dieser Situation zuverlässig umgehen möchten, müssen Sie wahrscheinlich Ihren eigenen Iterationscode verwenden, wie ich oben dargestellt habe.