Отслеживание нажатия кнопки очистки в 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
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какое событие используется для отслеживания действий пользователя при вводе текста в поле поиска?
1 / 5