Ожидание окончания ввода в поле 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, время: 11:49. |