Автор оригинала: FreeCodeCamp Community Member.
В JavaScript функция Debouting гарантирует, что ваш код срабатывает только один раз на ввод пользователя. Поиск Поиск Подсказки, автоматическое сохранение текстовых полей и устранение двойных щелчков нажима – это все возможности для расстройства.
В этом руководстве мы узнаем, как создать функцию Debouting в JavaScript.
Что такое отбор?
Термин Дебати исходит от электроники. Когда вы нажимаете кнопку, давайте скажем на вашем телевизоре, сигнал перемещается в микрочипу удаленного удаления так быстро, что, прежде чем вам удастся отпустить кнопку, она отскакивает, а микрочип регистрирует ваш «щелкнуть» несколько раз.
Чтобы уменьшить это, как только сигнал от кнопки получен, микрочип прекращает обработку сигналов от кнопки для нескольких микросекунд, в то время как для вас физически невозможно снова нажать его.
Господь в JavaScript
В JavaScript регистр использования аналогичен. Мы хотим вызвать функцию, но только один раз за использование корпуса.
Допустим, мы хотим показать предложения для поискового запроса, но только после того, как посетитель закончил набрать его.
Или мы хотим сохранить изменения в форме, но только когда пользователь не активно работает над этими изменениями, поскольку каждая «сохранение» стоит нам поездка в базе данных.
И мои любимые – некоторые люди действительно использовались для Windows 95, а теперь дважды щелкните все.
Это простая реализация Дебати Функция ( Кодепен здесь ):
function debounce(func, timeout = 300){ let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, timeout); }; } function saveInput(){ console.log('Saving data'); } const processChange = debounce(() => saveInput());
Его можно использовать на входе:
Или кнопка:
Или событие окна:
window.addEventListener("scroll", processChange);
И на других элементах, таких как простая функция JS.
Так что здесь происходит? Дебати
это специальная функция, которая обрабатывает две задачи:
- Выделение объема для Таймер Переменная
- Планирование вашей функции для срабатывания в определенное время
Давайте объясним, как это работает в первом случае с текстовым входом.
Когда посетитель пишет первую букву и выпускает ключ, Дебати
сначала сбрасывает таймер с Clearimeout (таймер)
Отказ На данный момент шаг не нужен, поскольку еще ничего не запланировано. Затем он расписан предоставленная функция- Сохранить ()
– вызывать в 300 мс.
Но скажем, что посетитель продолжает писать, поэтому каждый ключ отпускает триггеры Дебати
очередной раз. Каждый вызов должен сбросить таймер или, другими словами, отменить предыдущие планы с помощью Сохранить ()
и перенесите его для нового времени-300 мс в будущем. Это продолжается до тех пор, пока посетитель держит удар ключами до 300 мс.
Последнее расписание не будет очищено, поэтому Сохранить ()
наконец будет называться.
Наоборот вокруг – как игнорировать последующие события
Это хорошо для срабатывания автоматического сохранения или отображения предложений. Но как насчет случая использования с несколькими щелчками одной кнопки? Мы не хотим ждать последнего клика, а скорее зарегистрировать первый и игнорировать остальные ( кодепен здесь ).
function debounce_leading(func, timeout = 300){ let timer; return (...args) => { if (!timer) { func.apply(this, args); } clearTimeout(timer); timer = setTimeout(() => { timer = undefined; }, timeout); }; }
Здесь мы вызываем Сохранить ()
Функция на первом Debobity_leading
Вызов, вызванный первой кнопкой кнопки. Мы планируем разрушение таймера на 300 мс. Каждая последующая кнопка щелкните в течение этого TimeFrame уже будет определено таймером, и будет только толкать разрушение 300 мс в будущее.
Дебатируйте реализации в библиотеках
В этой статье я показал вам, как реализовать функцию Debouting в JavaScript и использовать ее, ну, отбросать события, вызванные элементами сайта.
Тем не менее, вам не нужно использовать свою собственную реализацию Дебати В ваших проектах, если вы не хотите. Широко используемые библиотеки JS уже содержат его реализацию. Вот несколько примеров:
Библиотека | Пример |
jQuery (через библиотеку) | $ .debounce (300, saveinput); |
Лоташ | _.debounce (SaveInput, 300); |
Нижнее подчеркивание | _.debounce (SaveInput, 300); |