何千ものアイテムを扱うときはいつでも、DOM 操作は遅くなります。通常、多くの DOM 要素をループして、その要素の特性に基づいて各要素を操作することはお勧めできません。これは、反復ごとに DOM メソッドを多数呼び出す必要があるためです。ご覧のとおり、本当に遅いです。
はるかに優れたアプローチは、データを DOM から分離しておくことです。JS 文字列の配列を検索すると、桁違いに速くなります。
これは、データセットを JSON オブジェクトとしてロードすることを意味する場合があります。それができない場合は、<li>
(ページの読み込み時に) s を 1 回ループして、データを配列にコピーできます。
データセットは存在する DOM 要素に依存しなくなったので、ユーザーが入力するたびに<ul>
使用中のコンテンツ全体を単純に置き換えることができます。.html()
(これは、単純に を変更するだけでブラウザが DOM の変更を最適化できるため、JS DOM 操作よりもはるかに高速ですinnerHTML
。)
var dataset = ['term 1', 'term 2', 'something else', ... ];
$('input').keyup(function() {
var i, o = '', q = $(this).val();
for (i = 0; i < dataset.length; i++) {
if (dataset[i].indexOf(q) >= 0) o+='<li>' + dataset[i] + '</li>';
}
$('ul').html(o);
});
ご覧のとおり、これは非常に高速です。
ただし、アイテム数を 10,000 まで上げると、最初の数回のキーストロークでパフォーマンスが低下し始めることに注意してください。これは、検索されるアイテムの生の数よりも、DOM に挿入される結果の数に関連しています。(入力する回数が多くなり、表示する結果が少なくなるため、10,000 項目すべてを検索しているにもかかわらず、パフォーマンスは良好です。)
これを避けるために、表示される結果の数を妥当な数に制限することを検討します。(1,000 はどれでも良いようです。) これはオートコンプリートです。誰も実際にすべての結果を調べているわけではありません。結果セットが人間にとって扱いやすいものになるまで、彼らは入力を続けます。