iTimeoutID
は、.on()
イベントハンドラ関数のローカル変数であるため、その関数が完了して次回に再作成されるたびに破棄されます。 1つのイベントから次のイベントまで生き残るために、そのスコープから上位レベルまたはグローバルレベルに移動します。
このようにすることができます。
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);
}
});
あなたはグローバル変数を回避したいか、あなたがこれらの複数を持っている場合は、あなたがこのようなオブジェクト上のタイマIDを保存するためにjQueryの.data()
を使用することができます。
$(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);
}
});
})();
これは何かQUICだった場合kと他のコードとの競合の可能性はほとんどなく、イベントハンドラによって提供されるオブジェクトは1つだけです。最初のオプションは完全にうまくいきます。
.on()
イベントハンドラが複数のオブジェクトを処理し、それぞれが自身の状態を追跡する必要がある場合は、2番目のオプションが最適です。
同じイベントハンドラに複数のオブジェクトがない場合は、新しいグローバル変数を追加しないでおくのが最も簡単な方法です。
ねえ、ありがとう!これはうまくいくでしょう。 – Nykad
もう1つのオプションが追加されました。イベントハンドラを越えて持続する非グローバル変数のシェルとして機能する自己実行匿名関数です。 – jfriend00