Search code examples
javascriptjqueryajaxlivesearch

Facebook Style AJAX Search


I've created a Facebook style ajax search for my site where as you type it will bring up the results in a nice list below your search.

$("#s").keyup(function() {
    var searchbox = $(this).val();
    var dataString = 's='+ searchbox;
    if(searchbox!='') {
        $.ajax({
            type: "POST",
            url: "/livesearch.php",
            data: dataString,
            cache: false,
            success: function(html){
                $("#display").html(html).show();
            }
        });
    } else {return false; }  
});

$("body").click(function() {
        $("#display").hide();
});

The problem with this is it's a little ineffective as the user will type a word for example "football". This will carry out 8 requests to the server. What would be a more effective way to do this? ideally i think it should store the request for 1 second before doing a search rather than instant keyup. but not 100% sure how to do that...


Solution

  • the method you are referring to is called "Debouncing"

    I usually have a "Debounce" function at the bottom of all my scripts

    var debounce=function(func, threshold, execAsap) {
        var timeout;
        return function debounced () {
            var obj = this, args = arguments;
            function delayed () {
                if (!execAsap)
                    func.apply(obj, args);
                timeout = null; 
            };
            if (timeout)
                clearTimeout(timeout);
            else if (execAsap)
                func.apply(obj, args);
            timeout = setTimeout(delayed, threshold || 100); 
        }; 
    };
    

    And then whenever I do anything that will benefit from a debounce I can use it generically

    So your code would be re-written as

    $("#s").keyup(debounce(function() {
        var searchbox = $(this).val();
        var dataString = 's='+ searchbox;
        if(searchbox!='') {
            $.ajax({
                    type: "POST",
                    url: "/livesearch.php",
                    data: dataString,
                    cache: false,
                    success: function(html){
                            $("#display").html(html).show();
                    }
            });
        } else {return false; }  
    }
    ,350 /*determines the delay in ms*/
    ,false /*should it execute on first keyup event, 
           or delay the first event until 
           the value in ms specified above*/
    ));