简体   繁体   中英

Get the index of an element excluding an element with a specific class?

I have a list which may or may not have a non-selectable list-item added to it dynamically. It looks like this (with the non-selectable list-item included):

<ul class="list js-list ">
  <li class="listLabel">
    <span>Make Selection:</span>
  </li>
  <li class="js-sppmg__li">
    <span class="listItem js-listItem" data-filter-id="All">All</span>
  </li>
  <li class="js-sppmg__li">
    <span class="listItem js-listItem" data-filter-id="One">One</span>
  </li>
  <li class="js-sppmg__li">
    <span class="listItem js-listItem" data-filter-id="Two">Two</span>
  </li>
  <li class="js-sppmg__li">
    <span class="listItem js-listItem" data-filter-id="Three">Three</span>
  </li>
</ul>

When I click on the third list item which is data-filter-id="Two" , I want the index:

parentIndex = $(this).parent().index();

to exclude the first, non-inclusive element which is listLabel . Is it possible to not include it in the index count? I've tried using .not() and class selectors etc but it returns either the same value as always ( 3 instead of 2 ) or -1 .

You need to select all li except .listLabel using :not() selector

 $(".listItem").click(function(){ var index = $(this).closest("ul").find("li:not(.listLabel)").index($(this).parent()); console.log(index); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="list js-list "> <li class="listLabel"> <span>Make Selection:</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="All">All</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="One">One</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Two">Two</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Three">Three</span> </li> </ul> 

You can do it like this parentIndex = $(".js-sppmg__li").index($(this).parent());

This will give you the index of a parent with the class .js-sppmg__li

Demo

 $(".js-listItem").click(function(){ parentIndex = $(".js-sppmg__li").index($(this).parent()); console.log(parentIndex); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="list js-list "> <li class="listLabel"> <span>Make Selection:</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="All">All</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="One">One</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Two">Two</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Three">Three</span> </li> </ul> 

I think you should apply a click event on li.js-sppmg__li > span instead .list li

$('li.js-sppmg__li > span').on('click', function(){
    var parentIndex = $(this).parent().index(); 
     parentIndex = parentIndex-1;
     console.log(parentIndex);

});

You can achieve what you require by using index() and providing it with a selector to find the group of elements to retrieve the index within. Try this:

 $('.js-listItem').click(function() { var index = $(this).index('.js-list .js-listItem'); console.log(index); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="list js-list "> <li class="listLabel"> <span>Make Selection:</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="All">All</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="One">One</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Two">Two</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Three">Three</span> </li> </ul> 

Check it..

 $('.js-list .js-sppmg__li').on('click',function(){ var nthelement=$(this).index() if(nthelement==3) alert(nthelement); }) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul class="list js-list "> <li class="listLabel"> <span>Make Selection:</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="All">All</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="One">One</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Two">Two</span> </li> <li class="js-sppmg__li"> <span class="listItem js-listItem" data-filter-id="Three">Three</span> </li> 

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