Dlaczego nie działa select[value=x]
? Po pierwsze dlatego, że <select>
nie ma atrybutu value
. Nie ma jednej wartości w polu wyboru: nie może być wybranych opcji (zwykle nie powinno być, ale może być co najmniej IE), a w <select multiple>
może być dowolna liczba wybranych opcji.
Nawet input[value=x]
nie działa, chociaż <input>
nie mieć atrybut value
. Cóż, działa, po prostu nie robi tego, co myślisz. Pobieramy wartość atrybutu value="..."
w HTML, , a nie z bieżącą wartością wprowadzoną w formularzu. Atrybut value="..."
faktycznie odpowiada właściwości defaultValue
, a nie value
.
Podobnie option[value=x][selected]
nie działa, ponieważ jest sprawdzanie atrybut <option selected>
ze źródła HTML (atrybut selected
->defaultSelected
własności) i nie obecny selectedness opcji (selected
własności nie przypisania) - co może się zmienić od momentu załadowania strony.
Z wyjątkiem IE, który dostaje value
, itp. Atrybuty formularza są nieprawidłowe.
wyjątkiem (znowu): przykład Tesserex może wydają do pracy, a powodem tego jest to, że jest za pomocą niestandardowego jQuery konkretnego wyboru, :has
. Powoduje to, że rodzime metody querySelectorAll
są nieskuteczne, co powoduje, że jQuery wraca do swojego własnego (natywnego JavaScript, powolnego) silnika selektora. Ten mechanizm selektora zawiera błąd, w którym mylone są właściwości atrybutów, dzięki czemu [value=x]
może zrobić to, czego się spodziewałeś i nie zawiedzie się tak jak powinno! (Aktualizacja: prawdopodobnie nie jest tak w przypadku nowszych wersji jQuery.)
Podsumowanie: sprawdzanie stanu pól formularza i selektory nie mieszają się. Oprócz tych problemów, musisz także martwić się o problemy z ucieczką - na przykład, jeśli wartość, którą chcesz przetestować, zawiera cytaty lub nawiasy kwadratowe?
Zamiast tego, tak, należy sprawdzić to ręcznie. Na przykład przy użyciu filtra.
$('select').filter(function() {
return $(this).val()==='the target value';
}).parent().addClass('warning');
(Jest value
nieruchomość w HTML5 i obsługiwana przez nowoczesnych przeglądarkach, że gdy czytasz to daje wartość pierwszego wybranego <option>
jQuery val()
jest bezpieczny w użyciu tutaj, ponieważ zapewnia tę samą metodę uzyskania pierwszej wybranej opcji nawet w przeglądarkach, które jej nie obsługują.)
Wow, więc moja odpowiedź działa z powodu błędu w interpretacji "wartości"? Ciekawy. – Tesserex
Niezbyt interesujące ... bardziej, irytująco mylące IMO! Ten obszar DOM obfituje w nieporozumienia i błędy, zarówno w przeglądarkach, jak i aplikacjach, co może bardzo utrudniać ustalenie, co się dzieje. – bobince
Oznacza to, że to prawdopodobnie nie powinno działać: '$ (" p "). Not (". Hidden_control ") find ('opcja: selected [value =" "]')' z tego samego powodu Tesserex 'code nie powinienem? Alternatywa wydaje się znacznie mniej elegancka, co jest wstydem ... –