2011-01-20 13 views
9

Czy ktoś wie o łatwym sposobie, używając jQuery, do wybrania wszystkich elementów <select>, których atrybut val() daje określoną wartość?jQuery: Wybierz wszystkie elementy "select" z pewną wartością()

Próbuję zrobić jakąś logikę walidacji i chciałbym wybrać te wszystkie elementy za pomocą jednego selektora, a następnie zastosować klasę ostrzegawczą do każdego z rodziców. Wiem, jak to zrobić, gdy wybiorę wszystkie elementy, ale nie widzę selektora, który obsługuje ten przypadek.

Czy będę musiał wybrać wszystkie elementy <select> w selektorze, a następnie przejrzeć je i sprawdzić każdą z ich wartości? Miałem nadzieję, że będzie prostszy sposób.

Dzięki.

Odpowiedz

23

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 (selectedwł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 valuenieruchomość 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ą.)

+0

Wow, więc moja odpowiedź działa z powodu błędu w interpretacji "wartości"? Ciekawy. – Tesserex

+0

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

+0

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 ... –

1

Attribute selectors Jest to, czego szukasz, wierzę.

Coś $+('element[attribute="value"]')

Zobacz także:

+0

Ta składnia niestety nie działa z tagami select. Ale robi to z innymi elementami wejściowymi. – Tesserex

+0

@Tesserex: Masz rację. Nie zamierzałem wymieniać tak wyraźnie, jak składni. Zmieniłem to, aby było trochę bardziej niejasne, dziękuję. –

+0

Właściwie to niekoniecznie działa dla _any_ elementów wejściowych. Oznacza to, że '.val()' zwraca bieżącą wartość _property_, a nie oryginalną wartość _atrybutu_, co jest testowane przez '[atrybut = 'wartość']. – Auspex

1

Można użyć:

$("select[value=X]"); 

gdzie X to wartość przed którym chcesz sprawdzić wartość SELECT jest.

10

Istniejące odpowiedzi nie działają na znacznikach select, ale znalazłem coś, co robi. Poproś o wybór, który ma wybraną opcję.

$("select:has(option[value=blah]:selected)") 
Powiązane problemy