Почему опции "выбрать" скрыты?

У меня есть 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

Вы можете просто добавить функциональность, которая уже должна быть: P

$("#f :hidden:not(option)").remove();

Ответ 2

Проверьте этот отчет об ошибке jQuery: http://bugs.jquery.com/ticket/6293

Особо следует отметить:

Изменено 3 месяца назад от john
Статус изменен с открытого на закрытый Разрешение установлено на wontfix

Учитывая, что каждый браузер, кроме Firefox говорит, что он скрыт - похоже, наоборот. Что я не уверен, что вы пытаетесь достичь с помощью: hidden/: отображается на элементах опции. Похоже, вы должны, вероятно, используйте: вместо этого выберите. Не думайте, что это то, что мы собирается провести много циклов.

В качестве исправления для этого случая я бы пошел на то, что уже предоставил @Joseph:

$("#f :hidden:not(option)").remove();

.., который работает по назначению: http://jsfiddle.net/thirtydot/G4Qnr/4/

Ответ 3

Try:

$(":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();

Ответ 5

Не уверен, почему, но вы можете исправить это с помощью селектора: not jQuery.

$("#f :not(option):hidden").remove();

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