2013-05-02 63 views
1

我需要改进自动完成脚本的性能。我需要的是,当我点击输入框elementID时,它将填充search.php中的选择列表,并由json_encode返回。以下脚本正在工作。但每次当我点击输入框时,它需要一段时间才能生成列表。关于自动完成性能的建议

("#elementID") 
.autocomplete({ 
    source: function(request, response) { 
    $.ajax({ 
     url: "search.php", 
     dataType: "json", 
     success: function(data){ 
     response(data[0]);         
     } 
    }); 
    }, 
    minLength: 0, 
    delay: 0, 
    select: function(event, ui){ 
    $(this).val(ui.item.value); 
    }, 
    change: function(event, ui) { //remove if not click from drop down 
    if (!ui.item) { 
     $(this).val(""); 
    } 
    }        
})  
.click(function() { //Click to activate 
    $("#elementID").autocomplete("search", " "); 
});  

在search.php中

$ocidb ->strTable  = "table"; 
    $ocidb ->strField  = "column1"; 
    $ocidb ->strCondition = "coulmn1 is not null"; 
    $result    = $ocidb->ORASelectRecord(); 
    echo json_encode(filter_unique_array($result, 'coulmn1')); 
    return; 

喜欢的了解一下,如果我正确地做事情还是有做它的另一个正确的方法?

+0

您在php脚本上检索了多少条记录?你尝试过使用分页吗?您是否尝试过在客户端和/或服务器端使用缓存? – rkrdo 2013-05-02 01:31:46

+0

如何对自动完成分页?那里有没有好的例子? – user1761160 2013-05-02 01:36:56

+0

可以在服务器端的查询中使用[LIMIT {[offset,] row_count]完成分页。要添加缓存DOM元素,你可以按照这个链接http://jqueryui.com/autocomplete/#remote-with-cache,因为我猜你正在使用jqueryui。 – rkrdo 2013-05-02 14:14:18

回答

1

首先你应该检查缓慢的来源在哪里。在Chrome开发人员工具进入网络选项卡,看看需要多长时间来加载自动完成列表:

Chrome Developer Tools

这会告诉你,如果这个问题是在服务器端或客户端上。如果时间或延迟一起大于300毫秒,那么等待服务器的可能性非常明显。您可能希望对您的服务器端代码进行基准测试,并查看瓶颈所在。从您的代码中,您可能希望在数据库中执行唯一性,而不是在PHP代码中执行。

如果服务器响应迅速,那么问题可能在于您的JavaScript。尝试寻找不同的自动完成库或尝试使其缓存DOM元素,而不是每次重新创建它们。

通常,某些缓存和可能的预取(在用户请求它们之前加载最初的一组结果)应该有助于在典型情况下。

+0

对不起,如何使它成为缓存DOM元素? – user1761160 2013-05-02 01:38:25

+0

很大程度上取决于图书馆的工作方式,您需要对其进行一些破解。 – 2013-05-02 01:44:59