2013-03-03 12 views
10

Warum gibt jQuery das gleiche Element zweimal zurück?Auswahl nach Element ID + Elementklasse ergibt dasselbe Element zweimal

Überprüft den HTML-Code mehrmals, es gibt nur einen <div> mit id="3" und class="password_field_real". Diese

ist das Ergebnis für das Erhalten alle Elemente mit class="password_field_real":

> $(".password_field_real") 

[ 
    <div class="password_field_real" id="2" style="display: none;"></div>, 
    <div class="password_field_real" id="3" style="display: none;"></div>, 
    <div class="password_field_real" id="7" style="display: none;"></div>, 
] 

Allerdings, wenn ich versuchen class="password_field_real" und id="3" zu bekommen, erhalte ich eine Liste von zwei divs, die gleich sind!

> $("#3.password_field_real") 

[ 
    <div class="password_field_real" id="3" style="display: none;"></div>, 
    <div class="password_field_real" id="3" style="display: none;"></div> 
] 

Dies ist nicht der Fall mit anderen zwei divs:

> $("#7.password_field_real") 

[ 
    <div class="password_field_real" id="7" style="display: none;"></div> 
] 

Warum konnte das passieren?

* UPDATE *

Reproduced dies in jsFiddle

* UPDATE # 2 *

Wenn nicht-numerischen IDs verwendet werden, alles works just fine.

+2

Welche Version von jQuery verwenden Sie? Können Sie sich ein jsFiddle oder ähnliches einfallen lassen, das dieses Problem aufzeigt? Ich kann das nicht mit jQuery 1.9.1 (http://jsfiddle.net/B7S2f/) reproduzieren. – Matt

+0

Sie wissen, numerische IDs sind nur legal in HTML5? – Alnitak

+0

Ich denke, es sollte kein Problem sein, wenn Sie mit dem Problem konfrontiert sind, dann löschen Sie zuerst den "Cache und Cookies", dann überprüfen Sie es erneut. –

Antwort

9

Zunächst einmal muss ein id auf einer Seite eindeutig sein . Das ist die Idee dahinter.

Ihr Problem ist, dass Sie einen ungültigen ID-Selektor (nach HTML4):

  1. ID und NAME-Token mit einem Buchstaben beginnen müssen ([A-Za-z]) und sein kann gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern ([0-9]), Bindestrichen ("-"), Unterstrichen ("_"), Doppelpunkten (":") und Punkten (".").

In anderen doctypes gibt es verschiedene Einschränkungen, aber Sie müssen immer mindestens einen Buchstaben. Da Sie nur eine Nummer verwenden, ist sie ungültig. Das könnte die Erklärung sein, wenn Sie nicht-numerische ID's alles gut verwenden. Trotzdem ist es ein bisschen komisches Verhalten von jQuery.

Fügen Sie Ihre IDs mit mindestens einem Buchstaben [A-Za-z] voran, oder noch besser, beschreibend.

7

NIEMALS mehr Mal die gleiche ID, ID muss

alert($("#3").length); // will just return 1 not 8 

dies wirklich dumm Code UNIQUE sein, dass nur wählen Sie Ihre gut, aber nie verwenden, verursacht Ende der Welt

alert($("#3").find("#3").filter(".password_field_real").attr("class")); 

wenn Sie Strom id für jeden Unter „div“ und „a“ müssen, versuchen Data- mit, warum nicht ein Code wie die

$(".password_entry").each(function(){ 
    var $t = $(this); 
    var currentId = $t.attr("id"); 
    $t.find("div,a").data("id",currentId); 
}); 

nein w Sie Strom id aus allen Unter "div" und "a" mit .data ("id")

von exemple extrahieren kann:

$(".password_field_mask").click(function(){ alert($(this).data("id")); });