Отслеживание нажатия кнопки очистки в HTML5 Search Input

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Определить момент очистки поля поиска можно через отслеживание отсутствия значения value во время события input:

JS
Скопировать код
document.querySelector('input[type="search"]').addEventListener('input', (e) => {
  if (!e.target.value) console.log('Поиск был очищен!');
});

В данном случае обработчик событий наблюдает за изменениями в поле поиска и реагирует на его очистку.

Кинга Идем в IT: пошаговый план для смены профессии

Используем событие 'input' в своих интересах

Событие input используется для отслеживания действий пользователя при вводе:

JS
Скопировать код
let searchInput = document.querySelector('input[type=search]');
searchInput.addEventListener('input', (e) => {
  if (!e.target.value) console.log('Поиск был очищен!');
});

Браузерные различия

Поведение события search, срабатывающего при использовании кнопки очистки, отличается в разных браузерах. В Chrome оно работает отлично, однако Firefox и Safari могут вести себя непредсказуемо. Рассмотрим решение этой проблемы:

JS
Скопировать код
inputElement.addEventListener('search', function(evt) {
  if (evt.target.value === '') {
    console.log('Очистка поиска выполнена при помощи кнопки очистки');
  }
});

Debouncing: усмирение чрезмерно активного события ввода

Поиск в реальном времени может иногда слишком активно реагировать на ввод. Воспользуемся приемом debouncing для управления частотой реакции:

JS
Скопировать код
let debounceTimeout;
const debounce = (fn, delay) => {
  return function() {
    clearTimeout(debounceTimeout);
    debounceTimeout = setTimeout(() => fn.apply(this, arguments), delay);
  };
};

const handleInput = debounce(() => console.log('Поиск был изменен'), 250);

document.querySelector('input[type=search]').addEventListener('input', handleInput);

Автозаполнение и сброс формы

Автозаполнение и сброс формы могут быть как удобными, так и неудобными, в зависимости от контекста. Вот как с ними работать:

JS
Скопировать код
form.addEventListener('reset', function() {
  console.log('Форма была сброшена – поиск очищен');
});

Отслеживание кнопки 'X'

Если стандартные методы не работают, вы можете попробовать разместить скрытую кнопку поверх вашей кнопки 'X' и отслеживать клики по ней:

HTML
Скопировать код
<input type="search" id="searchInput"/>
<div onclick="detectClear()" style="position: absolute; right: 2px; top: 2px;"></div>

Следите за тем, чтобы скрытая кнопка была неприметной и вписывалась в дизайн интерфейса.

Читаемость кода: вопрос вежливости или необходимости?

Хороший код — это продукт не только решения сложных задач, но и умения писать понятный и читаемый текст, который будет легко восприниматься и в дальнейшем:

JS
Скопировать код
function onSearchCleared() {
  console.log('Поиск был очищен!');
}

document.getElementById('searchInput')
  .addEventListener('input', (e) => {
    if (!e.target.value) onSearchCleared();
});

Взаимодействие с пользователем: не заставляйте меня думать!

Важен не только сам код, но и его взаимодействие с пользователем. Сделайте его удобным для очистки поля поиска:

JS
Скопировать код
let inputElement = document.querySelector('input[type="search"]');
inputElement.addEventListener('input', function(evt) {
  if (evt.target.value === '') {
    updateSearchStatus('Поиск очищен...');
  }
});

Визуализация

Перед очисткой:

Markdown
Скопировать код
🏖 – Поле Ввода – 🐾🐾🐾🐾🐾 (Следы поиска)

После очистки:

Markdown
Скопировать код
🏖 – Поле Ввода – 🌊 (Волна смывает следы)
JS
Скопировать код
inputElement.addEventListener('search', function(evt) {
  if (!this.value) {
    console.log('Поиск был очищен! 🌊');
  }
});

Акт очистки = Волна, которая смывает следы поиска.

ES6: возможности синтаксиса JavaScript

Расширьте возможности кода с помощью синтаксиса ES6:

JS
Скопировать код
const searchInput = document.querySelector('input[type=search]');
searchInput.addEventListener('input', ({currentTarget}) => {
  if (!currentTarget.value) console.log('Поиск был очищен');
});

Надежность в любом браузере

Убедитесь, что код работает корректно во всех браузерах:

JS
Скопировать код
inputElement.addEventListener('input', function(evt) {
  const isCleared = evt.target.value === '';
  handleSearchInput(isCleared);
});

function handleSearchInput(cleared) {
  if (cleared) {
    console.log('Поиск был очищен во всех браузерах');
  }
}

Полезные материалы

  1. Element: input event – Web APIs | MDN
  2. Best way to track onchange as-you-type in input type="text"? – Stack Overflow
  3. HTML Standard
  4. onsearch Event
  5. Form properties and methods
  6. HTML DOM Input Search Object
  7. Event delegation in the browser using vanilla JavaScript