これは、実際にはアンチパターンであると私が予想する検索ボックスの jQuery であり、私が指摘したいより良い解決策があると確信しています。
コメントはコードよりも明確で単純な場合があるため、コメントで説明してからコードを提供します。
- // キー押下時の関数呼び出しをセットアップします。
- // 関数呼び出しは、メイン イベントが発生する前に遅延があります。
- // keypress 関数が呼び出されると、以前にキューに入れられたイベントを消去し、標準の遅延レートで新しいイベントを作成します。
- // グローバルを使用して setTimeout ポインターを格納します。
- // 既存のポインタを clearTimeout します。
- // 新しい遅延を開始します。
コード:
// set up a filter function call on keypress.
$('#supplier-select-filter').keypress(function (){
// Currently, resets a delay on an eventual filtering action every keypress.
filterSuppliers(.3, this);
});
// Delayed filter that kills all previous filter request.
function filterSuppliers(delay, inputbox){
if(undefined != typeof(document.global_filter_trigger)){
clearTimeout(document.global_filter_trigger);
// clearTimeout any pre-existing pointers.
}
// Use a global to store the setTimeout pointer.
document.global_filter_trigger = setTimeout(function (){
var mask = $(inputbox).val();
$('#user_id').load("supplier.php?action=ajax_getsuppliers_html&mask="+escape(mask));
}, 1000*delay);
// Finally, after delay is reached, display the filter results.
}
問題点:
検索用語が平均で 10 文字で構成される入力ボックスでは、setTimeout を 0.5 秒で 10 回呼び出すことになります。これはプロセッサに負荷がかかるようです。私のテストでは、いくつかの顕著なパフォーマンスの問題が発生しているため、よりクリーンな方法があることを願っています。別?
.load() は、JSON を取り込んで json から html を生成するよりも簡単ですが、もっと良いツールがあるのではないでしょうか?
.keypress() は、バックスペースの削除やその他の必需品などで常にトリガーされるとは限らないため、おそらくこの入力ボックスで keypress() を使用するのは理想的ではありませんか?