Warum funktioniert der jQuery: visible-Selektor beim Filtern anders?

9

Ich habe heute festgestellt, dass jQuerys :visible Selektor ein unerwartetes Verhalten zeigt, wenn er mit einem Attributselektor kombiniert wird. Sein Verhalten unterscheidet sich abhängig von
a) ob es inline oder innerhalb der Filtermethode verwendet wird b) der Typ des Attributselektors, mit dem er kombiniert ist

Beispiele:

Gegeben das folgende Markup

%Vor%

Das Folgende gilt für jQuery

%Vor%

Das Attribut disabled zeigt ein ähnliches Verhalten. Datenattribute zeigen jedoch nicht das gleiche Verhalten:

Gegeben das folgende Markup

%Vor%

Das Folgende gilt für jQuery

%Vor%

Hier ist ein Link zu einer Geige , die das Problem demonstriert.

Ich würde nicht erwarten, dass [required="required"] ein Element mit einem leeren required -Attribut vergleicht, und nicht, wenn es als Selektor verwendet wird, aber wenn es mit dem Selector: visible gepaart wird. Warum ist das?

    
Andy F 24.06.2015, 13:14
quelle

1 Antwort

4

Die Ursache des Unterschieds scheint darin zu liegen, dass Sizzle (der nicht native Selektorcode in jQuery) mit booleschen Attributen wie required übereinstimmt, wenn ein expliziter Test für den formalen Standardattributwert durchgeführt wird. Der native querySelectorAll() -Code jedoch nicht, es sei denn, das Attribut hatte tatsächlich den Wert im ursprünglichen HTML.

Boolesche Selektoren wie required oder readonly können in HTML ohne Wert ausgedrückt werden, aber das bedeutet, dass der Wert als Attributname selbst verwendet werden muss.

Wenn Sie eine Pseudo-Klasse wie :visible verwenden, merkt Sizzle, dass der native Code nicht funktioniert und er übernimmt. Es ist nicht der :visible -Test selbst, der das Problem verursacht; Sie erhalten den gleichen Effekt mit :text oder einer anderen Erweiterung, die von Sizzle unterstützt wird (und die den Sinn des Selektors natürlich nicht ändert).

Persönlich würde ich dies als einen Fehler betrachten, obwohl es etwas schwierig zu beheben ist, weil der Attributwert wirklich als required gemeldet wird, wenn der DOM-Knoten über getAttribute() abgefragt wird.

Wenn HTML-Code sorgfältig mit den vollständig spezifizierten Attributen geschrieben werden sollte:

%Vor%

dann würde es keinen wahrgenommenen Unterschied geben, aber das scheint ein wenig belastend.

    
Pointy 24.06.2015, 13:53
quelle

Tags und Links