Ich bemerkte heute, dass der :visible
Selektor von jQuery ein unerwartetes Verhalten zeigt, wenn er mit einem Attributselektor kombiniert wird. Sein Verhalten unterscheidet sich in Abhängigkeit von
a) ob es inline oder in dem Filterverfahren verwendet wird
b) die Art der Attributselektor mitWarum funktioniert der jQuery: visible-Selektor beim Filtern anders?
Beispiele kombiniert wird:
Angesichts der folgenden Auszeichnungs
<input required name="name" type="text" />
folgendes gilt für jQuery
$('[required="required"]').filter(':visible').length == 0; //true
$('[required="required"]:visible').length == 0; //false - why does jquery find the input?
Das Attribut disabled
zeigt ein ähnliches Verhalten. Allerdings Datenattribute zeigen nicht das gleiche Verhalten:
mit dem folgenden Markup
<input data-boolean name="name" type="text" />
Das folgende gilt für jQuery
$('[data-boolean="true"]').filter(':visible').length == 0; //true
$('[data-boolean="true"]:visible').length == 0; //true
Hier ist ein Link zu einem fiddle dass demonstriert das Problem.
Ich würde nicht [required = "required"] erwarten, um ein Element mit einem leeren required -Attribut zu vergleichen, und es wird nicht als Selektor verwendet, aber wenn es mit dem: visible-Selektor gepaart wird . Warum ist das?
Attribute wie 'required' erhalten einen Wert, der der Attributname selbst ist, und zwar, ob Ihr Markup den Wert enthält oder nicht. Das 'data-boolean'-Beispiel ist anders, da es keinen impliziten Wert für solche Attribute gibt. – Pointy
$ ('[erforderlich]', '# myForm3'). Filter (': visible') scheint korrekt zu funktionieren sowie $ ('[erforderlich]: sichtbar', '# myForm3') – Nick
Der Unterschied ist fast sicherlich verursacht durch eine Unstimmigkeit zwischen dem nativen 'querySelectorAll()' Code und was Sizzle tut. Der native Code wird verwendet, wenn kein ': visible'-Selektor vorhanden ist, aber Sizzle wird verwendet, wenn es da ist. – Pointy