Jquery自动完成不使用大型数组

时间:2012-05-23 17:20:07

标签: php jquery arrays autocomplete

我有一个包含6000多个用户名的数组,我已经从MySQL中删除了这个:

$pop = mysql_query("SELECT * FROM import_student");
while ($r = mysql_fetch_assoc($pop)) {
 $student_array[] = $r['studentfirstname']." ".$r['studentlastname'];
}

    $big_array = json_encode($student_array); 

然后我将这个数组传递给JS并初始化我的自动完成函数。

<script>
$(document).ready(function() {
var availableTags = <?php echo $big_array; ?>;
console.log(availableTags);
    $( "#tags" ).autocomplete({
            source: availableTags
        });
});
</script>

当我将SQL结果限制为0,10时,这很有效,但是当我不限制并且我将6000个左右的用户名放入数组时,自动完成功能不起作用。我在firebug中收到此错误:

value is null 

return matcher.test( value.label || value.value || value );

任何人都知道我在这里做错了什么?就像我说的,当我限制结果时,这是有效的。关于拥有大型阵列的事情? IDK。

2 个答案:

答案 0 :(得分:1)

我之前测试过(1-2个字母的大约2k项),它与解析以及将大型结果集呈现给DOM有关。

您应该通过限制可能性来减少结果。您可以通过将最小字符数提高到至少3-4来实现此目的。

此外,您应该对结果集进行一些缓存,而不是让jQuery在每个条目中重新解析它。例如,我搜索了ad。我应该在键ad下的结果中存储结果。

var cache = {
    'ad' : [...results...],
    'adder' : [...results...],
    ...and so on...
}

当自动填充再次查询ad时,它应首先在缓存中搜索密钥并返回结果(如果存在)。您应该有一个缓存逻辑来避免过时的数据。 Afaik,jQuery在自动完成中有简单的缓存演示。

答案 1 :(得分:0)

我检索到同样的问题...您可以使用自动完成代替所有数组,一个部分由另一个脚本创建..类似于:

$('#tags').autocomplete({
        source : "aScript.php",
};

和aScript.php:

$autocompleteValue = $_GET["term"];
$pop = mysql_query("SELECT * FROM import_student WHERE 'studentfirstname' LIKE '$autocompleteValue%'");
while ($r = mysql_fetch_assoc($pop)) {
   $student_array[] = $r['studentfirstname']." ".$r['studentlastname'];
}

return json_encode($student_array);