简体   繁体   中英

How to Remove Element from Lists with Specific ID

I have two lists and I'd like to remove all li tags except for those li tags that contain input elements with -all as its id . Is this something I can achieve using selectors in jQuery? Possibly using not selector?

This is what I currently have: $("#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>

Instead of searching for <li> elements and then testing their content, you can test for input elements that are inside of li elements and then use the :not() CSS pseudo-class and the "ends-with" attribute selector ( $= ) along with the "starts-with" ( ^= ) attribute selector to exclude any irrelevant input elements. Then, you can remove the parent li of any matching elements with the Jquery .parent() method.

 // 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> 

Yes, you can use :not , :has , and an attribute-ends-with selector :

$("#search-filter-column ul li:not(:has(input[id$=-all]))").remove();

That matches li elements in a ul in #search-filter_column that don't contain an input whose id ends with -all .

In a comment elsewhere you've said

I also have li elements that contain -location-. I don't want to remove these li elements either.

You can have multiple :not conditions, li:not(this):not(that) . They AND together like other aspects of CSS selectors. So you'd do that like this with an attribute contains selector ( *= ):

$("#search-filter-column ul li:not(:has(input[id$=-all])):not(:has(input[id*=-location-]))").remove();

Live Example:

 $("#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> 

You can use jQuery's filter function for this in order to filter out the elements you do not want to remove:

 $("#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> 

In your example, I changed a few filters to not have -all in the id, to show that it will, in fact, remove those.

You try to select by ID, get parent and remove parent. Ex:

$('#ID_REMOVE').parent().remove()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM