#jquery #html #jquery-selectors
#jquery #HTML #jquery-селекторы
Вопрос:
У меня есть HTML-выбор, подобный этому:
<select name="something">
<option value="a">1</option>
<option value="b">2</option>
<option value="c">3</option>
</select>
и я заметил, что jquery интерпретирует, что параметры являются скрытыми тегами HTML. Проблема возникает, когда мне приходится удалять реальные скрытые теги, как в этом примере:
<form action="#" id="f">
<select name="something">
<option value="a">1</option>
<option value="b">2</option>
<option value="c">3</option>
</select>
<p style="display:none">hello world</p>
<any_tag style="display:none">some text</any_tag>
</form>
Если я выполню это:
$("#f :hidden").remove();
все параметры удалены. Вопрос в том, почему jquery удаляет параметры? и какой наиболее подходящий селектор для удаления только скрытых тегов? (хорошо или нет тегов опций)
Вот тест.
Комментарии:
1. Мне кажется, что все работает нормально… Какой браузер вы используете?
2. @lonesomeday: похоже, он сломан, как описано в любом браузере, кроме Firefox.
3. параметры удалены в Chrome 14
4. @thirtydot Вы правы. Решение 1: getfirefox.com 😉 Более серьезно, это звучит как довольно серьезная ошибка…
5. Хороший вопрос, проблема возникает в Chrome, firefox работает
Ответ №1:
Вы могли бы просто добавить функциональность, которая уже должна быть там: P
$("#f :hidden:not(option)").remove();
Ответ №2:
Ознакомьтесь с этим отчетом об ошибке jQuery: http://bugs.jquery.com/ticket/6293
Особого внимания:
Изменено 3 месяца назад Джоном
Статус изменен с открытого на закрытый
Разрешение установлено на wontfixУчитывая, что каждый браузер, кроме Firefox, говорит, что он скрыт, кажется, что все наоборот. При этом я не совсем уверен, чего вы пытаетесь достичь с помощью:hidden/:visible для элементов option . Похоже, вам, вероятно, следует использовать :selected вместо этого. Не думайте, что это то, на что мы собираемся потратить много циклов.
В качестве исправления для этого случая я бы выбрал то, что уже предоставил @Joseph:
$("#f :hidden:not(option)").remove();
.. который работает по назначению: http://jsfiddle.net/thirtydot/G4Qnr/4 /
Ответ №3:
Попробуйте:
$(":hidden").not("option")
Ответ №4:
В этом случае вы можете просто обернуть скрытые элементы в какой-либо контейнер и использовать jQuery для удаления элементов из контейнера:
<div id="foo">
<p style="display:none;">hello world</p>
</div>
Затем в jQuery вы можете просто сделать это:
$("#foo :hidden").remove();
Редактировать
Вот другой подход:
$("#f :hidden").not("option").remove();
Комментарии:
1. Проблема здесь в том, что я использую Jquery remove для анализа некоторых HTML-страниц, созданных пользователями … 🙁
Ответ №5:
Не уверен, почему, но вы можете исправить это, используя селектор:not jQuery .
$("#f :not(option):hidden").remove();
Комментарии:
1. Этот селектор не совсем правильный.
:not[option] :hidden
должно быть:not(option):hidden
.2. @thirtydot Спасибо за исправление! Как ни странно, сегмент кода также работал с неправильным синтаксисом селектора..