Олег Марков
Кнопка сброса в HTML input-reset - полное руководство
Введение
Кнопка сброса в HTML — это элемент формы, который позволяет быстро вернуть поля к их исходным значениям. Она создается при помощи тега input с атрибутом type="reset". На первый взгляд, все просто: нажали кнопку — и форма очистилась. Но на практике вокруг input-reset возникает много нюансов.
Смотрите, в этой статье я покажу вам, как именно работает кнопка сброса, какие поля она затрагивает, чем она отличается от кнопки отправки формы, как переопределить или дополнить ее поведение с помощью JavaScript, и как аккуратно применять ее в интерфейсе, чтобы не запутать пользователей.
Мы подробно разберем:
- синтаксис и базовое поведение input-reset;
- какие значения считаются «исходными» и когда они запоминаются;
- как сброс влияет на разные типы полей формы;
- как стилизовать кнопку сброса;
- как перехватывать и контролировать событие reset;
- распространенные ошибки и практические рекомендации.
Теперь давайте перейдем к конкретике.
Что такое input type="reset" и как он работает
Базовый синтаксис
Начнем с простого примера. Вот минимальная форма с кнопкой сброса:
<form>
<label>
Имя
<input type="text" name="username" value="Иван" />
<!-- Поле ввода с исходным значением "Иван" -->
</label>
<label>
Email
<input type="email" name="email" />
<!-- Поле без исходного значения, по умолчанию пустое -->
</label>
<input type="reset" value="Сбросить форму" />
<!-- Кнопка сброса: возвращает все поля в исходное состояние -->
</form>Как это работает:
- при загрузке страницы браузер запоминает начальные значения элементов формы;
- при нажатии на кнопку с type="reset" все элементы, входящие в эту форму, возвращаются к этим сохраненным значениям;
- событие распространяется на всю форму, а не только на соседние поля.
Важно: кнопка сброса не отправляет данные на сервер и не вызывает перехода на другую страницу. Она работает только внутри текущей формы.
Отличие от кнопки отправки формы
Часто начинающие путают type="reset" и type="submit". Давайте разберем на примере:
<form action="/search" method="get">
<input type="text" name="query" placeholder="Введите запрос" />
<input type="submit" value="Найти" />
<!-- Отправляет форму на сервер по адресу /search -->
<input type="reset" value="Очистить" />
<!-- Очищает поля, но ничего не отправляет -->
</form>Отличия:
- submit отправляет данные формы на сервер, срабатывает событие submit;
- reset ничего не отправляет, срабатывает событие reset;
- submit может быть перехвачен JavaScript, чтобы отправлять данные по AJAX или предотвращать отправку;
- reset также можно перехватить, чтобы добавить дополнительную логику (например, очистить результаты поиска).
Если вы случайно используете reset вместо submit, пользователи просто будут терять введенные данные, а форма не будет отправляться.
Где кнопка сброса уместна
Кнопка сброса полезна, когда:
- форма большая, и пользователь может захотеть начать заново;
- есть фильтры в каталоге или таблице, и вы хотите дать быстрый способ сбросить их к дефолтным значениям;
- вы разрабатываете интерфейс для опытных пользователей, которые хорошо понимают последствия.
Но в простых формах (регистрация, вход, одно-два поля) кнопка сброса чаще мешает, чем помогает: легко случайно нажать ее вместо отправки.
Как браузер запоминает исходные значения формы
Чтобы правильно пользоваться reset, важно понять, что такое «исходное значение» для браузера и когда оно фиксируется.
Момент фиксации исходных значений
Исходные значения формы запоминаются браузером:
- при загрузке документа;
- либо при динамическом добавлении элемента в DOM.
Это значит:
- если вы изменили value в HTML (в разметке) и перезагрузили страницу — новое значение станет исходным;
- если вы изменили value через JavaScript после загрузки — исходное значение для reset не изменится (если только элемент не был заново добавлен в DOM).
Давайте разберемся на примере:
<form id="userForm">
<input type="text" name="user" value="Иван" />
<input type="reset" value="Сбросить" />
</form>
<script>
// Смотрите, мы меняем значение поля сразу после загрузки
const input = document.querySelector('input[name="user"]');
input.value = 'Петр';
// Текущее значение в интерфейсе теперь "Петр"
// Но исходное значение, запомненное браузером, все еще "Иван"
</script>Если вы сейчас нажмете «Сбросить», поле вернется к «Иван», а не к «Петр».
Как программно сбросить форму
Функция кнопки сброса доступна и из JavaScript через метод reset() у DOM-элемента формы:
<form id="settings">
<input type="text" name="title" value="Моя страница" />
<button id="customReset">Сбросить настройки</button>
</form>
<script>
const form = document.getElementById('settings');
const btn = document.getElementById('customReset');
btn.addEventListener('click', function (event) {
event.preventDefault();
// Отменяем стандартное поведение кнопки (иначе она может быть воспринята как submit)
form.reset();
// Явно сбрасываем форму к исходным значениям
});
</script>Здесь я показываю пример, где вы используете обычную кнопку button, но логика сброса реализуется через JavaScript. Это полезно, если нужно:
- выполнить дополнительный код при сбросе;
- показать модальное окно подтверждения;
- сбросить только часть полей (чуть ниже мы это разберем отдельно).
Влияние кнопки сброса на разные типы полей
Теперь давайте посмотрим детальнее, как reset ведет себя с разными HTML-элементами формы.
Текстовые поля и textarea
Для input type="text", type="email", type="password", type="search", type="tel", а также для textarea логика одна:
- исходное значение берется из атрибута value (или содержимого textarea между тегами);
- при сбросе текущее value заменяется на исходное.
Пример:
<form>
<textarea name="comment">Исходный текст</textarea>
<!-- Исходное значение — "Исходный текст" -->
<input type="text" name="short" value="По умолчанию" />
<!-- Исходное значение — "По умолчанию" -->
<input type="reset" value="Сбросить" />
</form>При изменении пользователем и нажатии “Сбросить” оба поля вернутся к своим исходным значениям.
Чекбоксы и радиокнопки
Для checkbox и radio важны два параметра:
- checked — был ли элемент включен при загрузке страницы;
- value — само значение, которое отправляется на сервер (reset его не меняет).
Пример:
<form>
<label>
<input type="checkbox" name="subscribe" checked />
Подписаться на новости
<!-- Исходное состояние — включен -->
</label>
<label>
<input type="radio" name="gender" value="m" checked />
Мужчина
</label>
<label>
<input type="radio" name="gender" value="f" />
Женщина
</label>
<input type="reset" value="Сбросить" />
</form>Поведение:
- если пользователь снимет галочку с checkbox — reset вернет ее в исходное положение (в данном случае “включено”);
- если пользователь выберет “Женщина” — reset вернет выбор на “Мужчина”, так как он был помечен checked в HTML.
Селекты (select) и опции
Селекты ведут себя схожим образом:
- исходное выбранное значение — то, у которого указан selected (или первый по умолчанию, если selected нет);
- при сбросе выбранное option возвращается к исходному.
Пример:
<form>
<select name="city">
<option value="msk">Москва</option>
<option value="spb" selected>Санкт-Петербург</option>
<!-- Исходный выбор — "Санкт-Петербург" -->
<option value="nsk">Новосибирск</option>
</select>
<input type="reset" value="Сбросить" />
</form>Если пользователь сменит город, нажмет reset — вернется выбор “Санкт-Петербург”.
Для multiple-select (с множественным выбором):
- исходно выбранными считаются все option с атрибутом selected;
- reset возвращает этот набор выбранных опций.
Поля типа number, range, date и другие HTML5-поля
Современные поля (number, range, date, time и подобные) также подчиняются общему правилу:
- исходное значение — то, что было в атрибуте value при загрузке;
- при сбросе это значение восстанавливается;
- если value не указано, то поведение зависит от конкретного типа (обычно — пустое значение или минимальное).
Пример:
<form>
<input type="number" name="age" min="0" max="120" value="30" />
<!-- Исходное значение — 30 -->
<input type="range" name="volume" min="0" max="100" value="50" />
<!-- Исходное значение — 50 -->
<input type="reset" value="Сбросить" />
</form>После любых изменений reset вернет значения 30 и 50.
Файловые поля (input type="file")
Файловые поля особенные:
- по соображениям безопасности, браузер не позволяет устанавливать value для type="file" из HTML или JavaScript;
- исходным состоянием считается «ничего не выбрано».
Пример:
<form>
<input type="file" name="avatar" />
<!-- В исходном состоянии файл не выбран -->
<input type="reset" value="Сбросить" />
</form>Если пользователь выберет файл, а затем нажмет reset:
- выбор файла будет очищен;
- элемент вернется к состоянию «нет файла».
Кнопки и скрытые поля
- input type="hidden" — имеет исходное значение из атрибута value. Reset вернет его к этому значению, если вы меняли его через JavaScript;
- кнопки (button, input type="button", type="submit", type="reset") сами по себе не меняются при сбросе — у них нет «ввода» от пользователя.
Атрибуты input-reset и их использование
Хотя reset — довольно простой элемент, вы можете управлять его текстом, доступностью и поведением.
Атрибут value — текст на кнопке
Как правило, вы указываете value, чтобы задавать текст:
<input type="reset" value="Сбросить фильтры" />Если value не указано:
- браузер подставит стандартную подпись (например, «Reset»);
- текст зависит от языка интерфейса браузера и может не совпадать с языком сайта.
Поэтому лучше задавать value явно, чтобы интерфейс был консистентным.
Атрибут name
name для reset используется редко, но может быть полезен:
- для стилизации через CSS по селектору [name="..."];
- для нахождения кнопки в JavaScript через form.elements.name.
<form id="profile">
<input type="text" name="username" />
<input type="reset" name="resetProfile" value="Сбросить профиль" />
</form>
<script>
const form = document.getElementById('profile');
const resetButton = form.elements.resetProfile;
// Здесь мы получаем ссылку на кнопку сброса по имени
</script>Атрибут disabled
disabled позволяет временно отключать кнопку сброса:
<input type="reset" id="resetBtn" value="Сбросить" disabled />
<!-- Кнопка неактивна, нажать на нее нельзя -->
<script>
const resetBtn = document.getElementById('resetBtn');
// Давайте включим кнопку через 3 секунды
setTimeout(() => {
resetBtn.disabled = false;
// Теперь пользователь сможет нажать на кнопку
}, 3000);
</script>Это можно использовать, если вы хотите, чтобы сброс был доступен только после определенного действия (например, выбора хотя бы одного фильтра).
Атрибут form и formaction (и другие HTML5-атрибуты)
Кнопка reset, как и другие кнопки формы, может находиться вне самой формы, если у нее есть атрибут form:
<form id="searchForm">
<input type="text" name="q" placeholder="Поиск" />
</form>
<!-- Кнопка сброса находится вне тега form -->
<input type="reset" form="searchForm" value="Очистить форму" />Здесь я показываю, что по атрибуту form="searchForm" кнопка все равно будет относиться к этой форме и сбрасывать именно ее.
Атрибуты вроде formaction, formenctype, formmethod и т.п. не имеют смысла для type="reset", так как он не отправляет форму.
Стилистика и UX: как не запутать пользователя
Технически сделать кнопку reset легко, но важно, чтобы пользователь понимал, что произойдет при нажатии.
Расположение и визуальное отличие
Рекомендации по размещению:
- не ставьте reset рядом с основной кнопкой отправки формы без визуального отличия;
- делайте кнопку сброса менее акцентной (вторичный цвет, отсутствие заливки, меньший визуальный вес);
- добавляйте понятную подпись, например «Сбросить фильтры», а не просто «Сбросить».
Пример разметки с классами для стилизации:
<form class="filter-form">
<!-- Поля фильтров тут... -->
<div class="filter-form__actions">
<input type="submit" value="Применить фильтры" class="btn btn-primary" />
<!-- Основная кнопка -->
<input type="reset" value="Сбросить" class="btn btn-secondary" />
<!-- Вспомогательная кнопка -->
</div>
</form>Далее в CSS вы уже зададите стили так, чтобы btn-primary и btn-secondary визуально отличались.
Подписи и подсказки
Хорошо помогает:
- поясняющий текст рядом: «Сбросить все поля формы»;
- всплывающая подсказка title:
<input
type="reset"
value="Сбросить"
title="Вернуть все поля формы к исходным значениям"
/>Но полагаться только на title не стоит, так как подсказки не всегда заметны и работают не на всех устройствах (например, на мобильных).
Подтверждение действий при опасном сбросе
Если форма большая и потеря данных была бы неприятной, имеет смысл добавить подтверждение. Покажу, как это реализовано на практике с использованием события reset.
<form id="bigForm">
<!-- Много полей формы... -->
<input type="reset" value="Сбросить все данные" />
</form>
<script>
const bigForm = document.getElementById('bigForm');
bigForm.addEventListener('reset', function (event) {
// Спрашиваем подтверждение у пользователя
const ok = confirm('Вы уверены, что хотите сбросить все данные в форме');
if (!ok) {
event.preventDefault();
// Отменяем сброс, если пользователь передумал
}
});
</script>Обратите внимание, здесь мы используем событие reset и метод preventDefault, чтобы полностью контролировать поведение.
Работа с событием reset в JavaScript
Сейчас вы увидите, как именно можно перехватывать сброс формы и дополнять его кастомной логикой.
Событие reset у формы
Событие reset срабатывает на элементе form, а не на кнопке. То есть слушать его нужно именно у формы:
<form id="formWithLog">
<input type="text" name="firstName" value="Иван" />
<input type="reset" value="Сбросить" />
</form>
<script>
const form = document.getElementById('formWithLog');
form.addEventListener('reset', function (event) {
console.log('Форма будет сброшена');
// Здесь вы можете выполнить дополнительный код
});
</script>В этом обработчике вы можете:
- показывать уведомления;
- очищать дополнительные блоки на странице (например, результаты поиска);
- синхронизировать состояние с JavaScript-моделями данных.
Отмена сброса через preventDefault
Иногда нужно полностью запретить стандартный сброс и реализовать свою логику. Давайте посмотрим, как это делается:
<form id="customResetForm">
<input type="text" name="field1" value="По умолчанию" />
<input type="text" name="field2" value="Другое значение" />
<input type="reset" value="Сбросить" />
</form>
<script>
const form = document.getElementById('customResetForm');
form.addEventListener('reset', function (event) {
event.preventDefault();
// Отменяем стандартный сброс
// Выполняем собственную логику сброса
const field1 = form.elements.field1;
const field2 = form.elements.field2;
field1.value = '';
// Явно очищаем первое поле
field2.value = 'Стандарт';
// Для второго поля задаем особое "дефолтное" значение
});
</script>Как видите, этот фрагмент кода решает задачу кастомного сброса: мы полностью контролируем, какие значения будут установлены.
Программный сброс: form.reset()
Ранее мы уже упоминали form.reset(). Давайте разберем его чуть глубже.
<form id="autoResetForm">
<input type="text" name="q" />
</form>
<script>
const form = document.getElementById('autoResetForm');
// Смотрите, здесь мы программно устанавливаем значение
form.elements.q.value = 'Тест';
// А теперь через 5 секунд сбрасываем форму
setTimeout(() => {
form.reset();
// Это вызовет те же эффекты, что и нажатие кнопки reset
}, 5000);
</script>Важно:
- вызов form.reset() также инициирует событие reset;
- если в обработчике reset вы вызываете preventDefault, то и программный сброс отменится.
Частичный сброс формы: подходы и приемы
Браузер по умолчанию сбрасывает всегда всю форму целиком. Если вы хотите сбрасывать только часть полей, нужно писать свою логику.
Сброс только выбранных полей
Давайте разберемся на примере формы с фильтрами:
<form id="filterForm">
<label>
Поиск
<input type="text" name="search" />
</label>
<label>
Категория
<select name="category">
<option value="">Любая</option>
<option value="books" selected>Книги</option>
<option value="music">Музыка</option>
</select>
</label>
<label>
Только в наличии
<input type="checkbox" name="inStock" />
</label>
<button id="resetMain">Сбросить поля поиска и категории</button>
</form>
<script>
const form = document.getElementById('filterForm');
const resetBtn = document.getElementById('resetMain');
resetBtn.addEventListener('click', function (event) {
event.preventDefault();
// Не даем кнопке случайно отправить форму
// Сбрасываем только часть полей вручную
form.elements.search.value = '';
// Очистили поле поиска
form.elements.category.value = 'books';
// Вернули категорию к нашему "дефолту"
// Чекбокс inStock не трогаем
});
</script>Показываю вам, как это реализовано на практике: мы не используем type="reset", а сами управляем нужными полями.
Комбинированный подход: reset + донастройка
Иногда удобно сначала выполнить стандартный сброс, а затем изменить некоторые значения.
<form id="comboForm">
<input type="text" name="search" />
<input type="checkbox" name="rememberFilters" checked />
<input type="reset" value="Сбросить фильтры" />
</form>
<script>
const form = document.getElementById('comboForm');
form.addEventListener('reset', function () {
// Даем стандартному сбросу выполниться, не вызываем preventDefault
// А потом меняем только одно поле под свои правила
form.elements.rememberFilters.checked = true;
// Даже если по умолчанию в разметке чекбокс был unchecked
});
</script>Так вы можете сочетать стандартное поведение reset с дополнительной логикой.
Доступность и поддержка assistive-технологий
Если вы заботитесь о доступности, важно правильно описывать кнопку сброса для скринридеров и клавиатурной навигации.
Лейблы и aria-атрибуты
Обычно для кнопки сброса достаточно понятного текста value. Но если вам нужно уточнить назначение более детально, вы можете использовать aria-label:
<input
type="reset"
value="Сбросить"
aria-label="Сбросить все фильтры и вернуть форму к исходному состоянию"
/>Скринридер прочитает более подробное описание, но визуально пользователь увидит короткий текст «Сбросить».
Порядок табуляции и focus
Кнопка reset включена в порядок табуляции по умолчанию:
- пользователь может дойти до нее клавишей Tab;
- активировать с помощью Enter или Space.
Если вы не хотите, чтобы пользователь легко попадал на кнопку сброса при простой навигации по форме, можно:
- разместить ее после основной кнопки отправки;
- сделать ее менее заметной;
- но не отключать tabindex без крайней необходимости: это может ухудшить доступность.
Практические рекомендации и частые ошибки
Когда лучше не использовать reset
Не стоит добавлять кнопку сброса:
- в простой форме авторизации (логин + пароль);
- в формах с высокоценными данными (большой текст, сложные настройки), где случайный сброс будет болезненным;
- рядом с основным действием, если пользователи могут спутать их.
В таких случаях лучше либо не использовать reset совсем, либо заменять его осторожной кастомной кнопкой с подтверждением и понятной подписью.
Ошибка: reset без понимания исходных значений
Иногда разработчики меняют значения полей через JavaScript и ожидают, что reset вернет их к этим «новым» значениям. Но браузер ориентируется на изначальное состояние при загрузке.
Если вам нужно динамически менять «базовое» состояние формы (например, при смене профиля), у вас есть варианты:
- Пересоздавать форму в DOM (удалить и заново вставить HTML с новыми value) — браузер воспримет его как новое исходное состояние.
- Не использовать стандартный reset, а реализовать свою кнопку сброса, которая сама заполняет поля нужными значениями.
Ошибка: использование reset в качестве «очистить только одно поле»
Иногда встречается форма, где reset стоит рядом с одним полем, и предполагается, что он очищает только это поле. Но по факту сбрасывается вся форма.
Если задача — очистить конкретное поле, лучше:
- использовать кнопку button;
- добавить обработчик на click, который очищает нужное поле.
Пример:
<form>
<label>
Поиск
<input type="text" name="search" id="searchInput" />
</label>
<button type="button" id="clearSearch">Очистить поле поиска</button>
<!-- Это не reset, а обычная кнопка -->
</form>
<script>
const searchInput = document.getElementById('searchInput');
const clearBtn = document.getElementById('clearSearch');
clearBtn.addEventListener('click', function () {
searchInput.value = '';
// Очищаем только поле поиска
});
</script>Так вы избежите неожиданного сброса других значений формы.
Ошибка: отсутствие обработки события reset, когда есть связанное состояние
Если у вас есть:
- кастомные виджеты;
- состояния в JavaScript (например, выбранные теги, слайдеры, чекбоксы вне формы);
- отображаемые результаты, зависящие от формы,
то при сбросе формы важно синхронизировать их.
Решение: всегда, когда вы используете filter-форму, вешайте обработчик reset и приводите интерфейс в консистентное состояние: очищайте результаты, снимаете выделения, сбрасывайте кастомные контролы.
Функция кнопки сброса input-reset в HTML — это простой снаружи, но довольно тонкий инструмент. Она:
- всегда работает в контексте всей формы;
- опирается на исходные значения, зафиксированные при загрузке страницы;
- может быть перехвачена и переопределена через событие reset и метод preventDefault;
- хорошо подходит для фильтров, больших форм и интерфейсов для опытных пользователей;
- требует аккуратного применения в плане UX, чтобы не приводить к случайной потере данных.
Если вы понимаете, как именно браузер запоминает и восстанавливает значения, и умеете при необходимости дополнять поведение input-reset JavaScript-логикой, вы сможете использовать эту кнопку безопасно и предсказуемо.
Частозадаваемые технические вопросы
1. Как сделать так, чтобы после динамической подстановки данных reset возвращал форму именно к этим значениям
Стандартный reset ориентируется на исходные значения, зафиксированные при загрузке. Чтобы динамически обновить «базу», есть два подхода:
1) Полностью пересоздать форму:
- сформируйте новый HTML формы с нужными value;
- вставьте его в DOM вместо старой формы (innerHTML или replaceChild);
- браузер воспримет новые значения как исходные, и reset будет к ним возвращать.
2) Не использовать reset, а создать свою функцию:
- храните «актуальные дефолтные значения» в объекте JS;
- при нажатии кастомной кнопки сброса проходите по полям и заполняете их из этого объекта;
- не используйте type="reset" в этой кнопке (используйте button).
2. Как сбросить только чекбоксы и радиокнопки, не трогая остальные поля
Напишите обработчик, который:
- отменяет стандартный reset;
- обходит элементы формы и вручную управляет checked у нужных типов.
Пример мини-инструкции:
form.addEventListener('reset', function (event) {
event.preventDefault(); // отключаем стандартный сброс
Array.from(form.elements).forEach(el => {
if (el.type === 'checkbox' || el.type === 'radio') {
el.checked = el.defaultChecked;
// defaultChecked — исходное состояние из HTML
}
});
});Так вы сбросите только чекбоксы и радиокнопки.
3. Почему reset не сбрасывает кастомный виджет (например, select2 или datepicker)
Кастомные виджеты часто строят свой интерфейс поверх скрытого поля формы. Reset меняет value скрытого элемента, но сам виджет не обновляет отображение.
Решение:
- подпишитесь на событие reset формы;
- в обработчике вызовите специальные методы виджета для «очистки» или «обновления» (например, $('#select').val(null).trigger('change') для select2);
- не забудьте вызывать эти методы после стандартного сброса или вместо него.
4. Можно ли запретить сброс формы по клавише Esc
Некоторые браузеры и сценарии могут инициировать сброс не только кликом по кнопке, но и клавиатурой (хотя для Esc это поведение не является стандартным универсальным). Надежнее всего:
- отслеживать событие reset;
- в обработчике проверять источник события (если нужно);
- всегда вызывать event.preventDefault(), если вы не хотите позволять сброс вообще.
Если сброс не нужен принципиально, лучше просто не добавлять type="reset" и не вызывать form.reset() в коде.
5. Как сделать так, чтобы reset дополнительно очищал блок с результатами поиска
Подпишитесь на событие reset формы и вручную очистите нужный блок:
const form = document.getElementById('searchForm');
const results = document.getElementById('results');
form.addEventListener('reset', function () {
results.innerHTML = '';
// Очищаем область, где показывались результаты
});Так при каждом сбросе формы интерфейс будет полностью возвращаться в исходное состояние, включая связанные с формой данные.
Постройте личный план изучения Html до уровня Middle — бесплатно!
Html — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Html
Лучшие курсы по теме

HTML и CSS
Антон Ларичев
TypeScript с нуля
Антон Ларичев