developers. I need help. I have given below the code. when I type anything in the search box typed value matches the beginning of a list item. But I want when I type anything in the search box typed value to match any part of the search item and the text color will be red. I try so many times to do it.
function myFunction(e) { // find all `li` > a elements let col=document.querySelectorAll('ul#myUL li a'); // iterate through all elements; re-hide & remove className from each. col.forEach(n=>{ n.parentNode.style.display='none'; n.classList.remove('bold'); // if the typed value matches the beginning of a list item; display the text & assign Bold className if( this.value.length > 0 && this.value.trim()!='' && n.textContent.toLowerCase().startsWith( this.value.toLowerCase() ) ){ n.parentNode.style.display='block'; // make the whole word bold //n.classList.add('bold'); // make the matched portion bold n.innerHTML = `<span class="bold">${this.value}</span>` + n.textContent.substr(this.value.length) } }); } document.querySelector('input[name="search"]').addEventListener('keyup',myFunction);
* { box-sizing: border-box; } #myInput { background-image: url('/css/searchicon.png'); background-position: 10px 12px; background-repeat: no-repeat; width: 100%; font-size: 16px; padding: 12px 20px 12px 40px; border: 1px solid #ddd; margin-bottom: 12px; } #myUL { list-style-type: none; padding: 0; margin: 0; } #myUL li{ display:none; } #myUL li a { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block } #myUL li a:hover:not(.header) { background-color: #eee; } .bold{font-weight:bold;color:red
<input name='search' type="text" placeholder="Search for names.." title="Type in a name" /> <ul id="myUL"> <li><a href="#">Adele</a></li> <li><a href="#">Agnes</a></li> <li><a href="#">Billy</a></li> <li><a href="#">Bob</a></li> <li><a href="#">Calvin</a></li> <li><a href="#">Christina</a></li> <li><a href="#">Cindy</a></li> </ul>
Advertisement
Answer
Use includes()
instead of startsWith()
. To display the found text, you need to display the text before as well as the text after.
function myFunction(e) { // find all `li` > a elements let col=document.querySelectorAll('ul#myUL li a'); // iterate through all elements; re-hide & remove className from each. col.forEach(n=>{ n.parentNode.style.display='none'; n.classList.remove('bold'); // if the typed value matches the beginning of a list item; display the text & assign Bold className if( this.value.length > 0 && this.value.trim()!='' && n.textContent.toLowerCase().includes( this.value.toLowerCase() ) ){ n.parentNode.style.display='block'; // make the whole word bold //n.classList.add('bold'); // make the matched portion bold n.innerHTML = n.textContent.substr(0,n.textContent.toLowerCase().indexOf(this.value.toLowerCase()))+`<span class="bold">${this.value}</span>` + n.textContent.substr(n.textContent.toLowerCase().indexOf(this.value.toLowerCase())+this.value.length) } }); } document.querySelector('input[name="search"]').addEventListener('keyup',myFunction);
* { box-sizing: border-box; } #myInput { background-image: url('/css/searchicon.png'); background-position: 10px 12px; background-repeat: no-repeat; width: 100%; font-size: 16px; padding: 12px 20px 12px 40px; border: 1px solid #ddd; margin-bottom: 12px; } #myUL { list-style-type: none; padding: 0; margin: 0; } #myUL li{ display:none; } #myUL li a { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block } #myUL li a:hover:not(.header) { background-color: #eee; } .bold{font-weight:bold;color:red
<input name='search' type="text" placeholder="Search for names.." title="Type in a name" /> <ul id="myUL"> <li><a href="#">Adele</a></li> <li><a href="#">Agnes</a></li> <li><a href="#">Billy</a></li> <li><a href="#">Bob</a></li> <li><a href="#">Calvin</a></li> <li><a href="#">Christina</a></li> <li><a href="#">Cindy</a></li> </ul>