Я хочу, чтобы вызвать запрос Ajax, когда пользователь закончил вводить текстовое поле. Я не хочу, чтобы он запускал функцию каждый раз, когда пользователь вводит букву, потому что это приведет к МНОЖЕСТВУ ajax-запросов, однако я не хочу, чтобы они также нажимали кнопку ввода.
Есть ли способ, чтобы я мог определить, когда пользователь закончил печатать, а затем выполнить запрос ajax?
Используя jQuery здесь! Дейв
javascript
jquery
keyboard
Давид Зоричта
источник
источник
Ответы:
Итак, я думаю, что завершение набора означает, что вы просто остановитесь на некоторое время, скажем, 5 секунд. Итак, помня об этом, давайте запустим таймер, когда пользователь отпускает клавишу, и сбросим его, когда нажмем одну. Я решил, что рассматриваемый вход будет #myInput.
Делая несколько предположений ...
источник
doneTyping
в этом примере, запускается немедленно. Обычно это результат случайного включения()
после имени функции. Обратите внимание, что это должно читатьсяsetTimeout(doneTyping,
неsetTimeout(doneTyping(),
Выбранный ответ выше не работает.
Поскольку typingTimer иногда устанавливается несколько раз (нажатие клавиши дважды до нажатия клавиши для быстрого набора и т. Д.), Тогда оно не очищается должным образом.
Приведенное ниже решение решает эту проблему и вызывает X секунд после завершения, как было запрошено OP. Также больше не требуется избыточная функция нажатия клавиш. Я также добавил проверку, чтобы ваш вызов функции не происходил, если ваш ввод пуст.
И тот же код в ванильном решении JavaScript:
Это решение использует ES6, но здесь это не обязательно. Просто замените
let
наvar
и функцию стрелки на обычную функцию.источник
$('#myInput').on('input', function() {
если вы хотите, чтобы это работало с копированием и вставкой. Я не вижу смысла проверки, если вход пуст. Предположим, что он хочет стереть то, что набрал, это не сможет сделать вызов ajax.if ($('#myInput').val)
вместоif ($('#myInput').val())
? Должна.val
быть функция?Это всего лишь одна строка с функцией debounce underscore.js :
По сути, это говорит о том, что нужно сделать 500 миллисекунд после того, как я перестал печатать.
Для получения дополнительной информации: http://underscorejs.org/#debounce
источник
Uncaught ReferenceError: _ is not defined
Да, вы можете установить тайм-аут, скажем, 2 секунды на каждое событие key up, которое вызовет запрос ajax. Вы также можете сохранить метод XHR и прервать его при последующих событиях нажатия клавиш, чтобы еще больше сохранить полосу пропускания. Вот кое-что, что я написал для моего сценария автозаполнения.
Надеюсь это поможет,
Marko
источник
полный пример здесь: http://jsfiddle.net/ZYXp4/8/
источник
Оба топ-2 ответа не работают для меня. Итак, вот мое решение:
источник
Мне нравится ответ Surreal Dream, но я обнаружил, что моя функция doneTyping будет срабатывать при каждом нажатии клавиши, т. Е. Если вы действительно быстро наберете «Hello»; вместо того, чтобы запускать один раз, когда вы прекращаете печатать, функция срабатывает 5 раз.
Проблема заключалась в том, что функция javascript setTimeout, по-видимому, не перезаписывает и не уничтожает все старые установленные таймауты, но если вы сделаете это самостоятельно, это сработает! Поэтому я просто добавил вызов clearTimeout непосредственно перед setTimeout, если установлен typingTimer. См. ниже:
NB. Мне бы хотелось добавить это как комментарий к ответу Surreal Dream, но я новый пользователь и мне не хватает репутации. Сожалею!
источник
Изменение принятого ответа для обработки дополнительных случаев, таких как вставка:
источник
Я не думаю, что событие keyDown необходимо в этом случае (пожалуйста, скажите мне, почему, если я ошибаюсь). В моем (не jquery) скрипте подобное решение выглядит так:
Это мой первый ответ о переполнении стека, так что я надеюсь, что когда-нибудь это кому-нибудь поможет :)
источник
Объявите следующую
delay
функцию:и затем используйте это:
источник
Поздний ответ, но я добавляю его, потому что сейчас 2019 год, и это вполне достижимо при использовании довольно ES6, без сторонних библиотек, и я считаю, что большинство высоко оцененных ответов громоздки и отягощены слишком большим количеством переменных.
Элегантное решение взято из этого отличного поста в блоге.
источник
Ну, строго говоря, нет, так как компьютер не может угадать, когда пользователь закончил печатать. Конечно, вы можете запустить таймер при нажатии клавиши up и сбросить его при каждом последующем нажатии клавиши. Если таймер истекает, пользователь не набрал длительность таймера - это можно назвать «законченным набором».
Если вы ожидаете, что пользователи будут делать паузы во время набора текста, нет способа узнать, когда они закончили.
(Если, конечно, вы не можете сказать по данным, когда они сделаны)
источник
Я чувствую, что решение несколько проще с
input
событием:источник
согласен с ответом @going. Другое похожее решение, которое сработало для меня - это приведенное ниже. Единственное отличие состоит в том, что я использую .on ("input" ...) вместо keyup. Это только фиксирует изменения на входе. другие клавиши, такие как Ctrl, Shift и т. д. игнорируются
источник
Я только что понял простой код, чтобы дождаться, пока пользователь закончит набирать:
шаг 1. установите тайм-аут в ноль, а затем очистите текущий тайм-аут, когда пользователь печатает.
шаг 2.trigger очистить тайм-аут для определения переменной до того, как будет запущено событие keyup.
шаг 3. определить время ожидания для переменной, объявленной выше;
код JavaScript
источник
Я осуществлял поиск по своему списку, и мне нужно было, чтобы он был основан на ajax. Это означает, что при каждом изменении ключа результаты поиска должны обновляться и отображаться. Это приводит к тому, что на сервер отправляется так много вызовов ajax, что не очень хорошо.
После некоторой работы я применил метод проверки связи с сервером, когда пользователь перестает печатать.
Это решение сработало для меня:
Вы заметите, что нет необходимости использовать какой-либо таймер при реализации этого.
источник
Это простой код JS, который я написал:
источник
Вы можете использовать событие onblur, чтобы определить, когда текстовое поле теряет фокус: https://developer.mozilla.org/en/DOM/element.onblur
Это не то же самое, что «перестать печатать», если вас волнует случай, когда пользователь набирает кучу материала, а затем сидит там с текстовым полем все еще в фокусе.
Для этого я бы предложил связать setTimeout с событием onclick и предположить, что через x промежуток времени без нажатия клавиш пользователь перестал печатать.
источник
Почему бы просто не использовать onfocusout?
https://www.w3schools.com/jsreF/event_onfocusout.asp
Если это форма, они всегда будут покидать фокус каждого поля ввода, чтобы нажимать кнопку отправки, чтобы вы знали, что при вводе обработчика события onfocusout никто не упустит ввод.
источник
Если пользователю необходимо отойти от поля, мы можем использовать «onBlur» вместо Onchange в Javascript
Если это не является необходимым, настройка таймера будет хорошим вариантом.
источник
Как только вы обнаружите фокус на текстовом поле, при включении ключа выполните проверку тайм-аута и сбрасывайте его каждый раз, когда срабатывает.
Когда истечет время ожидания, сделайте запрос ajax.
источник
Если вы ищете конкретную длину (например, поле почтового индекса):
источник
Не уверен, что мои потребности просто странные, но мне нужно что-то похожее на это, и вот что я в итоге использовал:
Что позволяет мне иметь такие элементы в моем приложении:
Которые обновляются, когда пользователь «закончил печатать» (без действия в течение 2 секунд) или перешел в другое поле (размывается из элемента)
источник
Если вам нужно подождать, пока пользователь закончит ввод, используйте просто это:
Полный пример с вызовом ajax - это работает для моего пейджера - количество элементов в списке:
источник
Несколько таймеров на страницу
Все остальные ответы работают только для одного элемента управления ( мой другой ответ включен). Если у вас есть несколько элементов управления на странице (например, в корзине), будет вызван только последний элемент управления, где пользователь что-то набрал . В моем случае это, конечно, не желаемое поведение - у каждого элемента управления должен быть свой таймер.
Чтобы решить эту проблему, вам просто нужно передать идентификатор функции и поддерживать словарь timeoutHandles, как показано в следующем коде:
Объявление функции:
Использование функции:
источник
Просто и легко понять.
источник
Для передачи параметров в вашу функцию вместе с синтаксисом ES6.
источник
Вау, даже 3 комментария довольно правильные!
Пустой ввод не является причиной пропуска вызова функции, например, я удаляю ненужный параметр из URL перед перенаправлением
.on ('input', function() { ... });
должны быть использованы для запускаkeyup
,paste
иchange
событияопределенно
.val()
или.value
должны быть использованыВы можете использовать
$(this)
функцию внутри события вместо того,#id
чтобы работать с несколькими входами(мое решение) Я использую анонимные функции , а не
doneTyping
вsetTimeout
легко получать доступ$(this)
из n.4, но вы должны сохранить его первый какvar $currentInput = $(this);
РЕДАКТИРОВАТЬ Я вижу, что некоторые люди не понимают направления без возможности скопировать и вставить готовый код. Вот ты где
источник
paste
, не используетthis
и т. Д. (Я думаю, что это важно, но я не хочу потеряться в тоннах комментариев)