我有一个包含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。
答案 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);