Почему параметры «выбора» скрыты?

#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();
  

http://jsfiddle.net/G4Qnr/2/

Комментарии:

1. Этот селектор не совсем правильный. :not[option] :hidden должно быть :not(option):hidden .

2. @thirtydot Спасибо за исправление! Как ни странно, сегмент кода также работал с неправильным синтаксисом селектора..