#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. Привет, Берземус, спасибо за твой ответ. Я уже все готовое попробовал это. Это работает, но проблема в том, что это не задерживает само выполнение скрипта. Задержка после каждого нажатия клавиши…