У меня есть поле поиска. Прямо сейчас он ищет все ключи. Поэтому, если кто-то наберет «Windows», он выполнит поиск с помощью AJAX для каждого ключа: «W», «Wi», «Win», «Wind», «Windo», «Window», «Windows».
Я хочу иметь задержку, поэтому она выполняет поиск только тогда, когда пользователь перестает печатать в течение 200 мс.
Для этой keyup
функции нет опции , и я попробовал setTimeout
, но она не сработала.
Как я могу это сделать?
javascript
jquery
ajsie
источник
источник
Ответы:
Я использую эту небольшую функцию для той же цели, выполняя функцию после того, как пользователь прекратил печатать в течение определенного периода времени или в событиях, которые запускаются с высокой скоростью, например
resize
:Как это работает:
delay
Функция возвращает обернутую функцию , которая обрабатывает внутри отдельный таймер, в каждом исполнении таймер перезапускается с задержкой по времени при условии, если несколько казней произойти до проходит этот раз, таймер будет просто сбросить и начать заново.Когда таймер наконец заканчивается, выполняется функция обратного вызова, передавая исходный контекст и аргументы (в этом примере объект события jQuery и элемент DOM как
this
).ОБНОВЛЕНИЕ 2019-05-16
Я повторно реализовал функцию с использованием функций ES5 и ES6 для современных сред:
Реализация покрыта набором тестов .
Для чего-то более сложного, взгляните на плагин jQuery Typewatch .
источник
Если вы хотите выполнить поиск после завершения типа, используйте глобальную переменную для хранения времени ожидания, возвращенного вашим
setTimout
вызовом, и отмените его,clearTimeout
если он еще не произошел, чтобы он не запустил время ожидания, кроме последнегоkeyup
события.Или с анонимной функцией:
источник
Еще одно небольшое улучшение в ответе CMS. Чтобы легко учесть отдельные задержки, вы можете использовать следующее:
Если вы хотите использовать ту же задержку, просто сделайте
Если вы хотите отдельные задержки, вы можете сделать
источник
someApiCall
все равно срабатывает несколько раз - теперь только с окончательным значением поля ввода.Вы также можете посмотреть на underscore.js , который предоставляет такие служебные методы, как debounce :
источник
Основываясь на ответе CMS, я сделал это:
Поместите код ниже после включения JQuery:
И просто используйте так:
Осторожно: переменная $ (this) в функции, переданная в качестве параметра, не соответствует вводу
источник
Задержка многофункциональных вызовов с использованием меток
Это решение, с которым я работаю. Это задержит выполнение ЛЮБОЙ функции, которую вы хотите . Это может быть поисковый запрос по нажатию клавиши, может быть, быстрый щелчок по предыдущей или следующей кнопке (который в противном случае отправлял бы несколько запросов, если быстро нажимать непрерывно, и не использовался бы в конце концов). При этом используется глобальный объект, который сохраняет каждое время выполнения и сравнивает его с самым последним запросом.
Таким образом, в результате будет вызван только последний щелчок / действие, поскольку эти запросы хранятся в очереди, то есть после вызова X миллисекунд, если в очереди не существует другого запроса с такой же меткой!
Вы можете установить собственное время задержки (необязательно, по умолчанию 500 мс). И отправьте аргументы вашей функции в «режиме закрытия».
Например, если вы хотите вызвать нижеуказанную функцию:
Чтобы предотвратить несколько запросов send_ajax, вы задерживаете их, используя:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Каждый запрос, использующий метку «дата проверки», будет запускаться только в том случае, если в течение 600 миллисекунд не было сделано ни одного другого запроса. Этот аргумент не является обязательным
Пометьте независимость (вызывая ту же целевую функцию), но запустите обе:
Приводит к вызову одной и той же функции, но задерживает их независимо, потому что их метки отличаются
источник
Если кому-то нравится задерживать ту же функцию и без внешней переменной он может использовать следующий скрипт:
источник
Супер простой подход, разработанный для запуска функции после того, как пользователь закончил печатать в текстовом поле ...
источник
Эта функция немного расширяет функцию от ответа Гатена, чтобы вернуть элемент:
http://jsfiddle.net/Us9bu/2/
источник
Я удивлен, что никто не упомянул проблему с множественным вводом в CMS.
По сути, вам придется определять переменную задержки индивидуально для каждого входа. В противном случае, если sb поместит текст в первый ввод и быстро перейдет к другому вводу и начнет печатать, обратный вызов для первого не будет вызван!
Посмотрите код ниже, с которым я пришел, основываясь на других ответах:
Это решение сохраняет ссылку setTimeout внутри переменной inputTimer. Он также передает ссылку на элемент в функцию обратного вызова, как предложил fazzyx.
Протестировано в IE6, 8 (comp - 7), 8 и Opera 12.11.
источник
Это сработало для меня, когда я задерживаю операцию логики поиска и проверяю, совпадает ли значение с введенным в текстовом поле. Если значение одно и то же, я продолжаю и выполняю операцию для данных, связанных с поиском значения.
источник
Функция задержки для вызова при каждом включении. Требуется jQuery 1.7.1 или выше
Применение:
$('#searchBox').keyupDelay( cb );
источник
Это решение, аналогичное CMS, но решающее для меня несколько ключевых вопросов:
Применение:
Код написан в стиле, который мне нравится, вам может понадобиться добавить несколько точек с запятой.
Что нужно иметь в виду:
this
работает как положено (как в примере).setTimeout
.Решение, которое я использую, добавляет еще один уровень сложности, позволяя, например, отменить выполнение, но это хорошая основа для построения.
источник
Объединение CMS ответ с одного Мигеля дает надежное решение , позволяющее одновременно задержек.
Когда вам нужно отложить разные действия независимо, используйте третий аргумент.
источник
Основываясь на ответе CMS, вот новый метод задержки, который сохраняет «this» в его использовании:
Применение:
источник
использование
где expression - это сценарий, который нужно запустить, а timeout - это время ожидания в миллисекундах, прежде чем он запустится - это НЕ повреждает сценарий, а просто задерживает выполнение этой части до истечения времени ожидания.
сбросит / очистит тайм-аут, чтобы он не запускал скрипт в выражении (например, отмена), если он еще не был выполнен.
источник
Основываясь на ответе CMS, он просто игнорирует ключевые события, которые не меняют значение.
источник
Используйте плагин bindWithDelay jQuery:
источник
источник
Вот предложение, которое я написал, которое заботится о множественном вводе в вашей форме.
Эта функция получает объект поля ввода, вставленный в ваш код
Это фактическая функция delayCall, которая заботится о нескольких полях ввода.
Применение:
источник
Начиная с ES6 , можно также использовать синтаксис функции стрелки .
В этом примере код задерживает
keyup
событие на 400 мс после того, как пользователи закончили печатать, прежде чем вызыватьsearchFunc
запрос на запрос.источник
JQuery :
Чистый Javascript:
источник
Взгляните на плагин автозаполнения . Я знаю, что это позволяет указать задержку или минимальное количество символов. Даже если вы не используете плагин, просмотр кода даст вам некоторые идеи о том, как реализовать его самостоятельно.
источник
Ну, я также сделал кусок кода для ограничения высокочастотного запроса ajax от Keyup / Keydown. Проверь это:
https://github.com/raincious/jQueue
Сделайте ваш запрос так:
И связать событие, как это:
источник
Увидел это сегодня немного поздно, но просто хочу поместить это здесь на случай, если кому-то еще понадобится. просто разделите функцию, чтобы сделать ее многоразовой. код ниже будет ждать 1/2 секунды после ввода остановки.
источник
Пользовательская библиотека lodash javascript и использование функции _.debounce
источник
источник