1

我有一个包含 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 个左右的用户名放入数组时,自动完成功能不起作用。我在萤火虫中得到这个错误:

value is null 

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

有人知道我在这里做错了什么吗?就像我说的,这在我限制结果时有效。关于拥有一个大数组的东西?身份证。

4

2 回答 2

1

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

您应该通过限制可能性来减少结果。您可以通过将最少字符数提高到至少 3-4 个来做到这一点。

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

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

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

于 2012-05-23T17:23:06.390 回答
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); 
于 2012-07-13T06:55:24.123 回答