0

好的,我有一个搜索建议下拉菜单。

当我输入某个字符时,它会显示所有与我输入的值相同的结果。

使用函数 keyup()。

    var search = $("#search"),
    result = $('ul.dropdown');
    search.keyup(function(){
        if (search.val() !== "") {
            load();
            $.post('search.php?do=search', {search : search.val()}, function(data){
                if (data == ""){
                    stop_load();
                } else {
                    result.html(data);  
                }
            });
                $.post('search.php?do=search&data', {data : search.val()}, function(msg){
                    stop_load();
                    $('#end_results').html(msg);
                }); /** actual search **/
        } else {
            $('#end_results').html('');
            result.html('');
        }
    });

以及为此的PHP:

    } else { // the info
        $search = htmlentities(trim($_POST['search']));
        $search_query = "'%$search%'";
        $get_search = $db->prepare("SELECT * FROM `kit_info` WHERE `kit_name` LIKE $search_query LIMIT 10");
        $get_search->execute();
        while ($row = $get_search->fetch(PDO::FETCH_ASSOC)){
            $return .= '<li onClick=\'$("#search").val("'.$row['kit_name'].'");$("ul.dropdown").html("");search();\'>'.$row['kit_name'].'</li>';
        }
        echo $return;
    }

如您所见,PHP 回显了一个列表,该列表将在下拉建议中。

问题

当用户搜索 5 分钟左右,每次输入新字符等时,我的主机会自动阻止该 IP 发送太多请求

那是因为客户端已经超过了他的请求限制,并且将被阻止另外 24 小时。

我想到的一个解决方案:

从 mysql 加载所有数据,首先在页面加载时,然后执行操作。

问题

除了扩大限制之外,还有什么更好、更简单的解决方案吗?

我的解决方案很棒并且会奏效吗?我该怎么做?

非常感谢!

4

2 回答 2

1

有一些快速简便的方法可以做到这一点。其中之一是使用超时。

当我在 2 秒内输入 20 个字符时,无需进行 20 次查找。

此外,您可能不想从第一个字符开始搜索,但假设用户输入了 3 个字符。

$('#mysearchelement').keyup(function(){

    // stop any old timers to prevent double execution
    if($('#mysearchelement').data("searchtimer") !== undefined) 
    {
        clearTimeout($('#mysearchelement').data("searchtimer"));
    }

    // here we limit to minimum 3 characters before searching, you can omit this.
    if($(this).val().length > 2)
    {
        var timer = setTimeout(mySearchFunction, 500); // wait 500 ms before searching
        // store the timer in the search field so we know if there are any running
        $(this).data("searchtimer", timer);
    }

});    


function mySearchFunction()
{
    //here you do you actual calls to search.
}
于 2013-04-29T13:51:26.557 回答
0

试试这个;

http://jqueryui.com/autocomplete/

在完全相同的情况下为我工作出色!

于 2013-04-29T13:46:09.237 回答