example
Another option based on @Peeter code.
HTML:
<input type="text" id="input1"/> <ul id="list"> <li>Rich</li> <li>Rajim</li> <li>Andres</li> <li>Jorge</li> <li>Pedro</li> ... <li>Raul</li> <li>Paula</li> <li>Delfina</li> </ul>
CSS
li.h {display:none;}
JS:
contains selector
$.extend($.expr[':'], { 'containsi': function(elem, i, match, array) { return (elem.textContent || elem.innerText || '').toLowerCase() .indexOf((match[3] || "").toLowerCase()) >= 0; } }); // first option $("#input1").keyup(function() { var search = $(this).val().toLowerCase(); $._list = ($._list) ? $._list : $("#list li"); //cache $._list .removeClass("h") .filter(":not(:containsi('"+search+"'))").addClass("h"); });
EDIT
I think a little in the written code, I like to hide first and then display.
example
JS:
// second option $("#input1").keyup(function() { var search = $(this).val().toLowerCase(); $._list = ($._list) ? $._list : $("#list li"); $._list .addClass(function(index, currentClass) { var addedClass; if (currentClass !== "h" ) addedClass = "h"; return addedClass; }).filter(":containsi('"+search+"')").removeClass("h"); }); // third opcion $("#input1").keyup(function() { var search = $(this).val().toLowerCase(); $._list = ($._list) ? $._list : $("#list li"); $._list .hide() .filter(":containsi('"+search+"')").show(); });
source share