Ожидание окончания ввода в поле input
Не знаю как правильно сформулировать мысль, поэтому извиняюсь если тема уже повторялась.
Есть вот такой код, в кратце:
$('input[type="text"]').keypress(myFunc);
function myFunc(){
alert( $(this).val() );
}
Хочется сделать вызов myFunc после того, как пользователь завершил ввод. Т.е. с момента последнего нажатия клавиши прошло больше 1 секунды. Или поставить myFunc в очередь и отслеживать повторные вызовы. Сейчас я просто устанавливаю время последнего нажатия, засекаю его в другой переменной. Затем устанавливаю таймаут вызова myFunc в 1 сек. После чего проверяю, изменилось ли время последнего нажатия. Если нет, считаю, что пользователь завершил ввод и можно выполнить функцию, иначе выхожу. Получается, что для каждого нажатия клавиши, срабатывает эта проверка. Интуитивно чувствую, что есть другой способ, но не понимаю, как реализовать его. :help: |
других способов бесчётное количество, но ваш вполне оптимальный, если я его правильно понял.
|
Паттерн debounce.
https://github.com/Kolyaj/CrossJS/bl...unction.js#L26 |
после нажатия, если таймер установлен, сбрасывать и ставить по новой(по таймеру выполняется функция завершения ввоода),если не установлен просто ставить таймер-отпадает и проверка на
Цитата:
|
а не проще сделать отслеживание потери фокуса и по нему выполнять функцию? есть люди, которые оооочень медленно печатают :)
|
Цитата:
На данный момент все это очень сильно тормозит (несколько тысяч записей в дереве). Я пока отказался от варианта поиска по мере набора и сделал принудительную кнопку поиска. Комментарии выше прочитал спасибо, буду изучать. |
Цитата:
|
Как использовать debounce ?
Цитата:
Как я понял после подключения скрипта любая функция должна иметь в себе debounce То есть создаю функцию function test(text) { alert(text); } потом можно test.debounce('test') Но так не работает Как надо то ? |
debounce или запуск функции по окончании ввода
s_baklanov,
ввести текст, подождать 2сек.
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
/*https://github.com/Kolyaj/CrossJS/blob/master/source/lang/Function.js#L26 */
(function(Function_prototype) {
Function_prototype.debounce = function(delay, ctx) {
var fn = this, timer;
return function() {
var args = arguments, that = this;
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(ctx || that, args);
}, delay);
};
};
})(Function.prototype);
window.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('input');
function test() {
alert(this.value);
}
input.addEventListener('input', test.debounce(2000));
});
</script>
</head>
<body>
<input name="">
</body>
</html>
|
Спасибо !
|
| Часовой пояс GMT +3, время: 07:24. |