YouriTimeoutID
は.on()
イベント ハンドラー関数のローカル変数であるため、その関数が完了するたびに破棄され、次回再作成されます。あるイベントから次のイベントまで生き残ることができるように、その範囲からより高いレベルまたはグローバル レベルに移動します。
このようにできます。
var iTimeoutID = null;
$(document).on('keyup', '#filter_query', function (event) {
var iTypingDelay = 800,
sFilterVal = $.trim($('#filter_query').val()),
sFilterCat = $('#filter_catagory').val(),
sFilterCol = $('#filter_col').val();
if (iTimeoutID) {
clearTimeout(iTimeoutID);
iTimeoutID = null;
}
if (sFilterVal !== "") {
iTimeoutID = setTimeout(function() {
iTimeoutID = null;
searchFunction();
}, iTypingDelay);
}
});
グローバル変数を避けたい場合、またはこれらが複数ある場合は、jQuery を使用して、次の.data()
ようにタイマー ID をオブジェクトに保存できます。
$(document).on('keyup', '#filter_query', function (event) {
var self = $(this);
var iTimeoutID = self.data("timerID") || null;
var iTypingDelay = 800,
sFilterVal = $.trim($('#filter_query').val()),
sFilterCat = $('#filter_catagory').val(),
sFilterCol = $('#filter_col').val();
if (iTimeoutID) {
clearTimeout(iTimeoutID);
iTimeoutID = null;
}
if (sFilterVal !== "") {
iTimeoutID = setTimeout(function() {
self.data("timerID", null);
searchFunction();
}, iTypingDelay);
}
self.data("timerID", iTimeoutID);
});
以下は、自己実行関数を使用して、グローバルにならずにイベント ハンドラー全体で存続できるいくつかの変数のシェルとして機能する別のバージョンです。
(function() () {
var iTimeoutID = null;
$(document).on('keyup', '#filter_query', function (event) {
var iTypingDelay = 800,
sFilterVal = $.trim($('#filter_query').val()),
sFilterCat = $('#filter_catagory').val(),
sFilterCol = $('#filter_col').val();
if (iTimeoutID) {
clearTimeout(iTimeoutID);
iTimeoutID = null;
}
if (sFilterVal !== "") {
iTimeoutID = setTimeout(function() {
iTimeoutID = null;
searchFunction();
}, iTypingDelay);
}
});
})();
これが迅速で、他のコードと競合する可能性がほとんどなく、イベント ハンドラーによって提供されるオブジェクトが 1 つしかない場合は、最初のオプションで問題ありません。
.on()
イベント ハンドラーが複数のオブジェクトを提供し、それぞれが独自の状態を追跡する必要がある場合、2 番目のオプションが最適です。
同じイベント ハンドラーに複数のオブジェクトがない場合、新しいグローバル変数を追加しないようにする最も簡単な方法は 3 番目のオプションです。