I’m trying to program a search/filter function that searches through unordered list items with data-* attributes based on what the user types in.
<input type="text" placeholder="Search..." id="myInput" onkeyup="myFunction()">
<ul id="myUL">
<li><a href="#" data-keywords="photography">Digital Media Design</a></li>
<li><a href="#" data-keywords="computers">Information Technology</a></li>
<li><a href="#" data-keywords="coding">Programming</a></li>
</ul>
Here is the code I have so far that works only for one data-keywords item. I need help to get it to bring up search results based on multiple keywords.
<li><a href="#" data-keywords="photography photoshop illustrator premiere">Digital Media Design</a></li>
// Search functionality
function myFunction() {
// Declare variables
var input, filter, ul, li, a, i;
input = document.getElementById('myInput');
filter = input.value.toUpperCase();
ul = document.getElementById("myUL");
li = ul.getElementsByTagName('li');
// Loop through all list items, and hide those who don't match the search query
for (i = 0; i < li.length; i++) {
a = li[i].getElementsByTagName("a")[0];
if (a.innerHTML.toUpperCase().indexOf(filter) > -1 || $(a).data("keywords") === filter.toLocaleLowerCase()) {
li[i].style.display = "";
} else {
li[i].style.display = "none";
}
}
}
If anybody has suggestions on how I can improve the code that would be awesome!
2
Answers
This worked for me:
For clarification, do you want additional search terms to make the search more specific or less specific? Because my solution makes the search less specific as it will show any li matching any search term.
I’ve made a few assumptions:
The bit that needs most explaining is that regex. It’s using a standard trick for doing an
and
match:Regular Expressions: Is there an AND operator?
So if you search for
digital photography
the RegExp will be equivalent to:If you wanted searching to be
or
rather thanand
you’d just need to tweak the RegExp accordingly. If you wanted to do a starts-with match rather than substring you could throw inb
before each search term (suitably escaped as\b
in the string).I hope the rest is pretty self-explanatory, I tried to stay close to the code in the question.