Временная задержка включения JavaScript?

#javascript #delay #timedelay

#javascript #задержка #задержка по времени

Вопрос:

Еще раз привет, мастера Интернета 🙂 Теперь у меня новый глупый вопрос, и я прошу меня простить. Я везде читал об этом решении, но не нашел того, которое работает для меня.

У меня есть:

 <input name="domain" type="text" id="domain" onKeyUp="javascript:chk_me();">
  

Все, что я спрашиваю, это как сделать так, чтобы это проверялось не после нажатия кнопки, а после, скажем, 1000 миллисекунд бездействия клавиатуры?

Ответ №1:

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

 var timer;
function chk_me(){
   clearTimeout(timer);
   timer=setTimeout(function validate(){...},1000);
}
  

Таким образом, при каждом нажатии клавиши время ожидания будет удаляться и устанавливаться заново.

Комментарии:

1. Я думаю, var timer это должно быть вне тела функции

2. вы правы, таймер должен быть установлен вне функции, я отредактировал ответ

3. Спасибо! Лучший ответ из всех с приличным отрывом.

4. как вы думаете, сработает ли использование validate.apply (this)? я не знаю, как сохранить этот контекст

5. Всем привет. Нет, это снова не работает : ( Прошу прощения за мои глупые вопросы, но… куда я должен это поместить? Внутри тегов <head> или в <body>? Как бы то ни было, я попробовал оба метода, и это не сработало : ( Смотрите сами: spoonk.eu/includes/home/domain/domain.php

Ответ №2:

Другой подход, без глобальных:

 var typewatch = function(){
    var timer = 0;
    return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    }  
}();
  

Использование:

Прикрепление события с помощью JavaScript:

 window.onload = function () {
    document.getElementById('domain').onkeyup = function() {
        typewatch(function(){alert('Time elapsed!');}, 1000 );
    };
};
  

Или использование встроенного обработчика событий (не так рекомендуется), как у вас в вашем примере:

 <input type="text" name="domain" id="domain"
   onKeyUp="typewatch(function(){alert('Time elapsed!');}, 1000 );"/>
  

Попробуйте демо здесь.

Комментарии:

1. Что заставляет вас думать, что typewatch не является глобальным?

2. да, typewatch является глобальным, но я имею в виду, что переменная timer не входит в глобальную область видимости и может быть доступна только функции typewatch.

Ответ №3:

Действительно полезный пост!

Другой подход без глобальных значений, использующий свойства функции:

 function chk_me(){
   if(typeof timer !== undefined){
     clearTimeout(this.timer);
   }
   this.timer=setTimeout(function validate(){validate(...)},1000);
}
  

Ответ №4:

setTimeout() был бы единственным 😉

 <input name="domain" type="text" id="domain" onKeyUp="setTimeout('chk_me()',1000);">
  

текст ссылки

Комментарии:

1. Это не сохранит значение this контекстной переменной при вызове chk_me() . Кроме того, использование варианта setTimeout() , который принимает и вычисляет строку, содержащую код, является одновременно бессмысленным в этом сценарии и беспорядочным во всех сценариях.

2. Привет, Берземус, спасибо за твой ответ. Я уже все готовое попробовал это. Это работает, но проблема в том, что это не задерживает само выполнение скрипта. Задержка после каждого нажатия клавиши…