I am trying to get “Pen” , “All Pen” values.
Here is what i tried :- Please take a look at the code & share your thoughts Please take a look at the code & share your thoughts
var filtered_category = jQuery('ul.pc_filter_middle-stage2-list ul li:first-child').contents().get(0).nodeValue;
var parent_filtered_category = jQuery('ul.pc_filter_middle-stage2-list ul li:first-child').parents().find('#accordionItemhide li').contents().get(0).nodeValue;
console.log(filtered_category);
console.log(parent_filtered_category);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="ok_filter_middle-stage2-container active" style="display: block;">
<ul class="ok_filter_middle-stage2-list-title"><li><strong>Category</strong></li></ul>
<ul class="ok_filter_middle-stage2-list">
<div id="accordionItemhide" class="ok_filter_middle-stage2-list_wrapper">
<li style="font-weight: normal;">Pencil<span>(2200)</span><img src="/media/images/default/filter_arrow_down_white.svg" alt=""><arrow></arrow></li>
<div class="ok_filter_middle-stage2-category-list sub-category1">
<ul role="listbox" tabindex="0" aria-label="folder list">
<li data-value="2" tabindex="-1" role="option" class="active" aria-selected="false">Pencils<span>(200)</span></li><li data-value="8" tabindex="-1" role="option" class="active">Pencils<span>(300)</span></li> </ul>
</div>
</div>
<div id="accordionItemhide" class="ok_filter_middle-stage2-list_wrapper">
<li style="font-weight: normal;">Pen<span>(1200)</span></li>
<div class="ok_filter_middle-stage2-category-list sub-category2">
<ul role="listbox" tabindex="0" aria-label="folder list">
<li data-value="All Pen" tabindex="-1" role="option" aria-selected="false">All Pen<span>(10000)</span></li>
</div>
</ul>
</div>
Advertisement
Answer
Let’s first try to fix your HTML. Considering I don’t know what your program or site does I just refactor everything you had:
$(document).ready(() => {
const okFilter = $('.ok-filter');
const bodyContent = okFilter.find('.ok-filter__ul--body');
const secondCategory = bodyContent.find('.ok-filter_wrapper--category:nth-child(2)');
const secondCategoryListElements = secondCategory.find('.ok-filter__li');
const values = secondCategoryListElements.get().map((li) => li.childNodes[0].nodeValue, []);
console.log(values);
});
.ok-filter--active {
display: block;
}
.ok-filter__li--title {
font-weight: bold;
}
.ok-filter__li--item {
font-weight: normal;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="ok-filter ok-filter--active">
<ul class="ok-filter__ul ok-filter__ul--header">
<li class="ok-filter__li ok-filter__li--title">Category</li>
</ul>
<ul class="ok-filter__ul ok-filter__ul--body">
<div class="ok-filter__wrapper ok-filter_wrapper--category">
<li class="ok-filter__li ok-filter__li--item">Clothing<span>(2200)</span><img src="/media/images/default/filter_arrow_down_white.svg" alt=""><arrow></arrow></li>
<div class="ok-filter__wrapper ok-filter__wrapper--sub-category">
<ul class="ok-filter__ul" role="listbox" tabindex="0" aria-label="folder list">
<li class="ok-filter__li ok-filter__li--active" data-value="2" tabindex="-1" role="option" aria-selected="false">Bodysuit<span>(200)</span></li>
<li class="ok-filter__li ok-filter__li--active" data-value="8" tabindex="-1" role="option">Graphic Tees<span>(300)</span></li>
</ul>
</div>
</div>
<div class="ok-filter__wrapper ok-filter_wrapper--category">
<li class="ok-filter__li ok-filter__li--item">Shoes<span>(1200)</span></li>
<div class="ok-filter__wrapper ok-filter__wrapper--sub-category">
<ul class="ok-filter__ul" role="listbox" tabindex="0" aria-label="folder list">
<li class="ok-filter__li" data-value="All Shoes" tabindex="-1" role="option" aria-selected="false">All Shoes<span>(10000)</span></li>
</ul>
</div>
</div>
</ul>
</div>
In the script section, you have an example of how you can get the requested values. I separated them using the find()
function to give you more control & understanding of how to reach them. I have to be honest with you. If you aren’t planning to support IE then using jquery only slows you down. You could have used querySelector()
& querySelectorAll()
instead.
Secondly, try to get data from text nodes is a really bad practice. If you want a value that is altered for the user you could have used an attribute to store that data in the given element or using the <data>
element from HTML5. You could also just have wrapped it into a <span>
tag to make sure you selected the correct element.
Good luck