1

次のようにMySQLから取得した6000以上のユーザー名の配列があります。

$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。

4

2 に答える 2

1

以前にテストしました (1 ~ 2 文字で 2,000 個のアイテム)。これは、大きな結果セットを DOM にレンダリングするだけでなく、解析にも関係しています。

可能性を制限して結果を減らす必要があります。これを行うには、最小文字数を少なくとも 3 ~ 4 に上げます。

また、jQuery ですべてのエントリを再解析するのではなく、結果セットを少しキャッシュする必要があります。たとえば、 を検索しましたad。key の下の結果をオブジェクトに格納する必要がありますad

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

オートコンプリートがad再度クエリを実行する場合、最初にキャッシュ内のキーを検索し、存在する場合は結果を返す必要があります。古いデータを回避するには、キャッシュ ロジックが必要です。ご存知のように、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 に答える