Добавьте этот код в условие if (textIndex != -1) {}
, он добавит тег mark
к согласованному входу:
const rgxVal = `(${val})`;
const rgx = new RegExp(rgxVal, 'gi');
li[i].innerHTML = txt.replace(rgx, `<mark>$1</mark>`);
Я также удалил toUpperCase()
от txt
и val
и добавляйте его только при тестировании на совпадение:
const textIndex = txt.toUpperCase().indexOf(val.toUpperCase());
if (textIndex != -1) {
...
Демо:
var ip = document.getElementById('catInput');
var ul = document.getElementById('myUl');
var li = ul.getElementsByTagName('li');
document.getElementById('total').innerHTML = "" + (li.length) + "";
ip.addEventListener('input', function() {
var val = this.value, idx = 0;
for (var i = 0; i < li.length; i++) {
var txt = li[i].textContent;
if(val) {
var textIndex = txt.toUpperCase().indexOf(val.toUpperCase());
if (textIndex != -1) {
li[i].style.display = '';
const rgxVal = `(${val})`;
const rgx = new RegExp(rgxVal, 'gi');
li[i].innerHTML = txt.replace(rgx, `<mark>$1</mark>`);
idx++;
} else {
li[i].style.display = 'none';
}
} else {
idx = 3;
li[i].style.display = '';
li[i].innerHTML = txt;
}
}
if (idx == 0) {
document.getElementById('total').innerHTML = "No results";
} else{
document.getElementById('total').innerHTML = idx;
}
});
<input type="search" id="catInput">
<ul id="myUl">
<li>Hello</li>
<li>Test</li>
<li>Javascript</li>
</ul>
<span id="total"></span>