Unterschied zwischen find ('option [selected]') und find ('option') filter ('[selected]')

9

Szenario:

Ich habe zwei jQuery-Ausdrücke:

%Vor%

was bedeuten (nehmen wir an, es gibt nur ein select im Dokument, zur Vereinfachung):

  • A : Holen Sie sich select und suchen Sie dann alle option Nachkommen, die ein Attribut mit dem Namen selected .
  • haben
  • B : Holen Sie sich select und suchen Sie dann alle Nachkommen von option . Filtern Sie anschließend nach denen, die ein Attribut mit dem Namen selected .
  • haben

Erwartetes Verhalten:

A und B sollten dasselbe Ergebnis liefern.

Tatsächliches Verhalten:

Nachdem der Benutzer die Auswahl im Dropdown-Menü geändert hat,

  • A gibt den Standard zurück, der option .
  • ausgewählt wurde
  • B gibt das neue ausgewählte option .
  • zurück

Frage:

Warum sind sie anders? Ist mein Verständnis über CSS-Selektoren falsch?

Live-Demo:

Live-Demo ist hier hier .

Quellcode:

HTML :

%Vor%

JavaScript :

%Vor%

Testergebnis:

%Vor%
  • default bedeutet, dass der ausgewählte Standard option .
  • zurückgegeben wird
  • new bedeutet, dass das neue ausgewählte option .
  • zurückgegeben wird

Wie Sie sehen können, geben alle Browser außer IE6 andere Ergebnisse.

    
Pang 30.10.2012, 11:10
quelle

5 Antworten

1

Was sollen die Ausdrücke zurückgeben?

[selected] stimmt mit allen Elementen überein, die ein Attribut selected haben, mit einem beliebigen Wert (Referenzen: W3C , jQuery ).

Warum sind die Ergebnisse inkonsistent?

Ich habe einen Fehlerbericht an jQuery hier gesendet. Es ist markiert als ein Duplikat von einem weiteren Fehlerbericht , der jetzt behoben ist.

Irgendwelche Lösungen?

Um die aktuelle Auswahl zu erhalten :

Verwenden Sie den :selected Selektor (Live-Demo hier ):

%Vor%

Beachten Sie, dass der zweite Ausdruck laut doc . < sein sollte / p>

  

Da :selected eine jQuery-Erweiterung ist und nicht Teil der CSS-Spezifikation ist, können Abfragen, die :selected verwenden, nicht den Leistungsschub nutzen, der von der nativen Methode DOM querySelectorAll() bereitgestellt wird.

Um die Standardauswahl zu erhalten:

Verwenden Sie für jQuery 1.9 + einen der Ausdrücke wie in der Frage, d. h.

%Vor%

Verwenden Sie für jQuery 1.6 + die defaultSelected -Eigenschaft (Live-Demo hier ) , Referenzen: w3schools , Mozilla , MSDN , MSDN ):

%Vor%     
Pang 07.11.2012, 02:39
quelle
3

Die Sizzle-Engine prüft die selected -Eigenschaft eines Elements (die den aktuellen -Wert enthält) und nicht das -Attribut , das den Wert enthält Original (Standardwert).

Siehe Ссылка

Was ich noch nicht herausgefunden habe, ist, warum dein zweiter Selektor anscheinend Sizzle aufruft, aber der erste scheint das nicht zu tun.

In jedem Fall sollten Sie die Eigenschaft überprüfen, die Sie überprüfen sollten, und nicht das Attribut. Daher sollten Sie den Pseudo-Selektor :selected und nicht [selected]

verwenden     
Alnitak 30.10.2012 11:37
quelle
1

Wenn Sie option[selected] schreiben, wird nach dem Attribut selected / property gesucht stattdessen sollten Sie option:selected verwenden Wenn Sie die Eigenschaft readonly haben und den Code option[readonly] eingeben, wird s

zurückgegeben

$ ('[Attribut]') wählt Elemente mit dem angegebenen Attribut mit einem beliebigen Wert aus.
Für weitere Informationen: Hat Attributauswahl [name]

Geige

%Vor%     
Pragnesh Chauhan 30.10.2012 11:20
quelle
0

Dies hängt davon ab, wie das DOM vom Browser erstellt wird. Verwendung von option[selected] jQuery sucht nach einem Optionselement mit dem ausgewählten Attribut, das in einigen Fällen nicht angewendet wird

Sie sollten

verwenden %Vor%     
Matei Mihai 30.10.2012 11:19
quelle
0

Ihre Implementierung ist falsch, es ist nicht

%Vor%

Es sollte sein,

%Vor%

Hier ist die bearbeitete Geige:

Ссылка

und Referenz:

Ссылка

    
Never Back Down 30.10.2012 11:22
quelle