Client-Side Filter

jQuery

by nabeezy

HTML

<input id="filterBox"/>

<ul>
    <li class="hideable hideable2">
        <div>
            <div class="searchable">AAA search this text</div>
            <div>BBB non-searchable text</div>
        </div>
    </li>
    <li class="hideable">
        <div class="searchable">CCC search this text</div>
        <div>DDD non-searchable text</div>
    </li>
    <li class="hideable">
        <div class="searchable">EEE search this text</div>
        <div>FFF non-searchable text</div>
    </li>
    <li class="hideable">
        <div class="searchable">GGG search this text</div>
        <div>HHH non-searchable text</div>
    </li>
    <li class="hideable">
        <div class="searchable">III search this text</div>
        <div>JJJ non-searchable text</div>
    </li>
</ul>

JavaScript

/*filter = $("#filterBox");

searchables = $(".searchable");
hideables = $(".hideable");

filter.keyup(function(){
    results = '';
    userString = filter.val();
    userString = userString.toLowerCase();
    hideables.show();
    searchables.each(function(){
        guts = this.innerText;
        guts = guts.toLowerCase();
        if (guts.indexOf(userString) < 0){
            $(this).closest('.hideable').hide();
        }
    })
})

*/


function closest(el, className){
    var par = el.parentNode;
    if(!par) return null;
    
    var classes = par.className.split(' ');
    for(var i in classes){
        if(classes[i] == className) return par;
    }

    return closest(par, className);
};

var d = document,
    filter = d.getElementById('filterBox');
    searchables = d.getElementsByClassName('searchable');

filter.onkeyup = function(){
    for(var i=0; i<searchables.length; i++){
        var searchable = searchables[i],
            guts = searchable.innerText.toLowerCase(),
            userString = filter.value.toLowerCase(),
            hideable = closest(searchable, 'hideable');
        if(hideable){
            if(guts.indexOf(userString) < 0){
                hideable.style.display = 'none';
            } else {
                hideable.style.display = 'list-item';
            }
        }
        
    }
};