Case insensitive and highlight filter
Filters elements in a list depending on user entered text.
HTML
<form>
<input type="text" id="filterText" placeholder="filter"/>
<button id="resetFilter" style="display:none">X</button>
</form>
<ul id="list">
<li>aaAAaaa</li>
<li>bbbbbbb</li>
<li>ababAba</li>
<li>adadada</li>
<li>dddDDdd</li>
</ul>
CSS
.highlight { background-color: yellow }
JavaScript
$(function () {
var toHandler = 0, $FilterTxt, lastFilter = '';
//
function init() {
$FilterTxt = $('#filterText').on('keyup', KeyUpOn_FilterTxt);
$('#resetFilter').on('click', resetFilter);
}
function KeyUpOn_FilterTxt() {
if (toHandler) clearTimeout(toHandler);
toHandler = setTimeout(doFilter, 300);
}
function resetFilter(e) {
if (e) e.preventDefault();
lastFilter = '';
$FilterTxt.focus().val('');
$('#list li').show().unhighlight();
$('#resetFilter').hide();
}
function doFilter() {
var _txt = $FilterTxt.val();
if (_txt.length) {
$('#resetFilter').show();
if (_txt != lastFilter) {
lastFilter = _txt;
$('#list li').hide().unhighlight().filter(':MyCaseInsensitiveContains(' + _txt + ')').show().highlight(_txt);
}
}
else resetFilter();
}
//
init();
});
// jQuery plugin for case insensitive text search
// Source: http://stackoverflow.com/questions/2196641/how-do-i-make-jquery-contains-case-insensitive-including-jquery-1-8
jQuery.extend($.expr[":"], {
"MyCaseInsensitiveContains": function (elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
// jQuery Highlight plugin
// http://bartaz.github.io/sandbox.js/jquery.highlight.html
jQuery.extend({ highlight: function (a, b, c, d) { if (a.nodeType === 3) { var e = a.data.match(b); if (e) { var f = document.createElement(c || 'span'); f.className = d || 'highlight'; var g = a.splitText(e.index); g.splitText(e[0].length); var h = g.cloneNode(true); f.appendChild(h); g.parentNode.replaceChild(f, g); return 1 } } else if ((a.nodeType === 1 && a.childNodes) && !/(script|style)/i.test(a.tagName) && !(a.tagName === c.toUpperCase() && a.className === d)) { for (var i = 0; i <...