У меня есть два списка, и я хотел бы удалить все теги li
, кроме тегов li, которые содержат элементы ввода с -all
в качестве его id
. Могу ли я добиться этого с помощью селекторов в jQuery? Возможно, используется не селектор?
Вот что у меня сейчас есть: $("#search-filter-column ul li").remove();
<ul>
<li>
<input id = "filter-types-all" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-suv" name = "filter-types-suv" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-special" name = "filter-types-special" type = "checkbox" checked = "checked">
</li>
</ul>
<ul>
<li>
<input id = "filter-company-all" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-1" name = "filter-company-1" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-2" name = "filter-company-2" type = "checkbox" checked = "checked">
</li>
</ul>
<ul>
<li>
<input id = "filter-location-1" name = "filter-location-1" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-2" name = "filter-location-2" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-3" name = "filter-location-3" type = "checkbox" checked = "checked">
</li>
</ul>
Да, вы можете использовать :not
, :has
и селектор атрибут-заканчивается-с:
$("#search-filter-column ul li:not(:has(input[id$=-all]))").remove();
Это соответствует элементам li
в ul
в #search-filter_column
, которые не содержат input
, чей id
заканчивается на -all
.
В комментарии в другом месте вы сказали
I also have li elements that contain -location-. I don't want to remove these li elements either.
У вас может быть несколько состояний :not
, li:not(this):not(that)
. Они И вместе, как и другие аспекты селекторов CSS. Таким образом, вы бы сделали это с помощью атрибут содержит селектор (*=
):
$("#search-filter-column ul li:not(:has(input[id$=-all])):not(:has(input[id*=-location-]))").remove();
Живой пример:
$("#search-filter-column ul li:not(:has(input[id$=-all])):not(:has(input[id*=-location-]))").remove();
<div id = "search-filter-column">
Types:
<ul>
<li>
<input id = "filter-types-all" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-suv" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-special" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
</ul>
Companies:
<ul>
<li>
<input id = "filter-company-all" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-1" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-2" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
</ul>
Locations:
<ul>
<li>
<input id = "filter-location-1" name = "filter-location-1" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-2" name = "filter-location-2" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-3" name = "filter-location-3" type = "checkbox" checked = "checked">
</li>
</ul>
</div>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
@Michael: Это селектор конца атрибута. Подробнее по ссылке выше. :-)
Вместо поиска элементов <li>
и последующего тестирования их содержимого вы можете проверить элементы input
, которые находятся внутри элементов li
, а затем использовать :not()
CSS псевдокласс и селектор атрибутов "заканчивается на" ($=
) вместе с селектор атрибута "начинается с" (^=
) для исключения любых нерелевантных элементов input
. Затем вы можете удалить родительский li
из любых совпадающих элементов с помощью метода JQuery .parent()
.
// Remove all input elements that are descendants of an <li> that don't have
// an id that ends with ($=) "all" or an id that starts with "filter-location-".
$("#search-filter-column ul > li input:not([id$='-all']):not([id^='filter-location-'])").parent().remove();
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "search-filter-column">
<ul>
<li>
<input id = "filter-types-all" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-suv" name = "filter-types-suv" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-special" name = "filter-types-special" type = "checkbox" checked = "checked">
</li>
</ul>
<ul>
<li>
<input id = "filter-company-all" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-1" name = "filter-company-1" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-2" name = "filter-company-2" type = "checkbox" checked = "checked">
</li>
</ul>
<ul>
<li>
<input id = "filter-location-1" name = "filter-location-1" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-2" name = "filter-location-2" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-location-3" name = "filter-location-3" type = "checkbox" checked = "checked">
</li>
</ul>
</div>
Спасибо! Что означает $ =?
@Michael См. Мой обновленный ответ. Это означает «заканчивается на», потому что вы хотите, чтобы элементы ввода, которые называются «id
», заканчивались на -all
.
Быстрый вопрос: только что столкнулся с проблемой, lol, что, если бы я хотел удалить все элементы li, у которых нет filter-location- AND -all в качестве идентификатора? Можно ли добавить к селектору ИЛИ?
@Michael Можете уточнить. id
должен быть чем? Я не вижу никаких элементов в вашем примере с id
, который содержит filter-location
.
У меня также есть элементы li, содержащие -location-
. Я тоже не хочу удалять эти элементы li. Прямо сейчас при использовании вышеупомянутого он удаляет эти элементы.
@Michael: У вас может быть несколько состояний :not
, li:not(this):not(that)
. Они И вместе, как и другие аспекты селекторов CSS.
Я обновил сообщение новым списком, содержащим -location-
@Michael Мне пришлось уйти, но я обновил ответ, чтобы решить эту проблему. Вы просто объединяете несколько селекторов псевдокласса CSS :not()
вместе, чтобы создать больше условий. В вашем новейшем случае вы должны использовать селектор атрибута "содержит" (*=
).
Для этого вы можете использовать функцию jQuery filter
, чтобы отфильтровать элементы, которые вы не хотите удалять:
$("#search-filter-column ul li").filter(function() {
return $(this).find('input[id$=-all]').length;
}).remove();
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id = "search-filter-column">
<ul>
<li>
<input id = "filter-types-all" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-suv" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-types-special" name = "filter-types-all" type = "checkbox" checked = "checked">
</li>
</ul>
<ul>
<li>
<input id = "filter-company-all" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-1" name = "filter-company-all" type = "checkbox" checked = "checked">
</li>
<li>
<input id = "filter-company-2" name = "filter" type = "checkbox" checked = "checked">
</li>
</ul>
</div>
В вашем примере я изменил несколько фильтров, чтобы в идентификаторе не было -all, чтобы показать, что он фактически их удалит.
Вы пытаетесь выбрать по ID, получить родителя и удалить родителя. Бывший:
$('#ID_REMOVE').parent().remove()
Спасибо! Что означает $ =?