Тайм-аут JavaScript срабатывает 3 раза вместо одного (clearTimeout не работает?)

Я хочу запустить действие ajax, когда пользователь делает паузу в наборе текста (а не после каждого нажатия клавиши). Поэтому я сделал что-то вроде этого:

Когда пользователь перестает печатать после 3 секунд простоя, функция должна быть выполнена ... (это так - но почему 3 раза для длинных фраз - я ожидаю, что она будет запускаться только один раз, так как я очищаю таймаут после каждого нажатия ). В чем проблема?

var timer; 
var interval = 3000; 
$('#inp').keyup(function() {
  timer = setTimeout(done, interval); 
}); 

$('#inp').keydown(function() {
  clearTimeout(timer)  
}); 

function done() {
  console.log('ajax'); 
}

Рабочий пример на jsfiddle: http://jsfiddle.net/vtwVH/

10 голосов | спросил user1983515 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 16:58:58 +0400000000pmFri, 01 Feb 2013 16:58:58 +040013 2013, 16:58:58

2 ответа


0

Проблема в том, что вы перезаписываете переменную timer в событии keydown.

Поэтому, если вы нажмете другую клавишу до того, как тайм-аут будет очищен, например, продолжайте удерживать клавишу

Ссылка на timeOut потеряна, и вы не можете удалить ее снова.

Чтобы это исправить, вы можете просто очистить и установить таймер в событии keyUp наподобие

var timer; 
var interval = 3000; 


$('#inp').keyup(function(e){ 
    if(timer) {
        clearTimeout(timer);
    }
    timer = setTimeout(done, interval); 

}); 

function done() {
    console.log('ajax'); 
}

Вот рабочая скрипка

ответил Moritz Roessler 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 17:08:07 +0400000000pmFri, 01 Feb 2013 17:08:07 +040013 2013, 17:08:07
0

Кажется, что события не следуют строгим последовательным правилам, второе нажатие клавиши происходит раньше, чем первое, поэтому таймер инициализируется несколько раз.

Попробуйте этот мод:

$('#inp').keyup(function(){
  clearTimeout(timer);
  timer = setTimeout(done, interval); 
}); 
ответил kms 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 17:04:52 +0400000000pmFri, 01 Feb 2013 17:04:52 +040013 2013, 17:04:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132