Почему не select[value=x]
не работает?Ну, во-первых, потому что <select>
на самом деле не имеет атрибута value
.В поле выбора нет ни одного значения: не может быть никаких выбранных параметров (обычно их не должно быть, но может быть хотя бы в IE), а в <select multiple>
может быть любое количество выбранныхoptions.
Даже input[value=x]
не работает, хотя <input>
имеет с атрибутом value
.Ну, это работает, это просто не делает то, что вы думаете.Он извлекает значение атрибута value="..."
в HTML, , а не текущее значение, которое вы ввели в форму.Атрибут value="..."
фактически соответствует свойству defaultValue
, а не value
.
Аналогично, option[value=x][selected]
не работает, поскольку он проверяет атрибут <option selected>
из источника HTML (selected
attribute -> defaultSelected
свойство) и не текущая выбранная опция (selected
свойство не атрибут) - которая могла измениться с момента загрузки страницы.
За исключением IE, который неправильно принимает атрибуты формы value
, selected
и т. Д.
Кроме (снова): пример Tesserex может работать * и причинапотому что он использует нестандартный jQuery-специфичный селектор :has
.Это приводит к сбою собственных методов querySelectorAll
современных браузеров, и, следовательно, jQuery возвращается к своему собственному (собственный JavaScript, slow ) движку селектора.Этот механизм выбора имеет ошибку, из-за которой он путает свойства атрибутов, позволяя [value=x]
делать то, что вы ожидали, и не терпеть неудачу, как должно!(Обновление: это, вероятно, больше не имеет место в более новых версиях jQuery.)
Сводка: проверка состояния поля формы и селекторы не смешиваются.Помимо этих проблем, вам также нужно беспокоиться об избежании проблем - например, что если значение, которое вы хотите проверить, содержит кавычки или квадратные скобки?
Так что вместо этого, да, вы должны проверить это вручную.Например, используя фильтр:
$('select').filter(function() {
return $(this).val()==='the target value';
}).parent().addClass('warning');
(В HTML5 есть свойство value
, поддерживаемое современными браузерами, которое при прочтении выдает значение первого выбранного<option>
. JQuery val()
безопасен для использования здесь, поскольку он обеспечивает тот же метод получения первой выбранной опции даже в браузерах, которые не поддерживают это.)