jQuery UI - 加速自动完成

Posted

技术标签:

【中文标题】jQuery UI - 加速自动完成【英文标题】:jQuery UI - speeding up Autocomplete 【发布时间】:2011-08-14 19:29:47 【问题描述】:

我的自动完成功能运行良好,但我正在努力想办法让它更快。这是我的 html

Country: <select name='country' id='country' onchange="renewAutocomplete();">
             <option value='US'>USA</option>
             <option value='UK'>United Kingdom</option>
         </select><br/>
City: <input type='text' name='city' id='city' />
<script>
   function renewAutocomplete() 
      $( "#city" ).autocomplete(
            source: "searchCities/" + $('#country').val(),
            minLength: 2
        );
   
</script>

php/mysql 查询非常基础:

$term = $_GET['term'];
$sql = "SELECT city FROM cities WHERE country_code = '$country' AND city LIKE '$term%'";

当然,这意味着每次击键都有一个新的查询。添加一些缓存会有所帮助,但仍然没有我认为的那么快。

问题 1 我的第一个想法是在选择国家/地区时在一个数据库调用中获取所有城市。有没有办法将返回的国家所有城市的 JSON 分配给自动完成可以使用的变量?我的初始测试只会在您输入时弹出所有城市:

      $.get("searchCities/" + $('#country').val(), function(data) 
                    $( "#city" ).autocomplete(
                        source: data,
                        minLength: 2
                    );
        );
PHP: 
    $sql = "SELECT city FROM cities WHERE country_code = '$country'";

问题 2 由于城市和国家/地区变化不大(通常),因此只有一个包含所有值的平面文件会更快吗?

或者有没有其他方法可以更快地自动完成?

谢谢。

【问题讨论】:

【参考方案1】:

    自动完成假定如果您返回它,它就是一个有效的答案。所以:没有

    是的,从平面文件中提取比每次击键都敲击数据库要快得多。但是,如果您在 db 前面放置一些缓存(memcache),它可能与平面文件一样快。

但实际上,因为您(可能)正在为您的术语搜索(相对)较小的集合,所以无论如何它都会非常快。

从缩放的角度来看,将它们保存在平面文件中或使用缓存。

附带说明:查看mysql_escape_string() 是否使用$country 和$term。否则,您可以向SQL Injection attacks 开放。

【讨论】:

谢谢。我确实尝试了一个基本的缓存,它确实提高了速度,但我想我希望有更多类似谷歌的速度(对于一个小网站来说可能是不切实际的)。至于转义输入,我所在的框架会自动执行此操作。为了简单起见,我只是在问题中使用未转义的字符串。再次感谢!

以上是关于jQuery UI - 加速自动完成的主要内容,如果未能解决你的问题,请参考以下文章

jquery UI 自动完成:我克隆的自动完成字段不起作用

jQuery-ui 自动完成,选择第一项

如何实现类似于 jQuery UI 自动完成的 Dojo 自动完成?

jQuery UI 自动完成与类似 Chrome 的自动填充

单独更改 jquery-ui 自动完成小部件的宽度

检测 jQuery UI 自动完成