Кратко
СкопированоАтрибут readonly делает поля формы доступными только для чтения. Пользователь не сможет изменить значение такого поля, но сможет выделить и скопировать текст.
Пример
Скопировано
<form> <div> <label for="username">Имя пользователя</label> <input type="text" value="Алиса" readonly id="username"> </div> <div> <label for="comment">Комментарий</label> <textarea readonly id="comment"> Этот текст нельзя отредактировать </textarea> </div></form>
<form>
<div>
<label for="username">Имя пользователя</label>
<input type="text" value="Алиса" readonly id="username">
</div>
<div>
<label for="comment">Комментарий</label>
<textarea readonly id="comment">
Этот текст нельзя отредактировать
</textarea>
</div>
</form>
Как понять
СкопированоИногда нужно показать пользователю информацию в поле формы, но при этом запретить её редактирование. Например:
- отображение данных из профиля, которые нельзя изменить;
- показ результатов расчётов;
- демонстрация значений по умолчанию.
В таких случаях пригодится атрибут readonly.
Этот атрибут позволяет:
- выделять и копировать текст;
- полю ввода получать фокус с клавиатуры;
- отправлять данные из поля ввода на сервер;
- стилизовать элемент через CSS при помощи псевдокласса.
Как пишется
Скопированоreadonly — это булевый атрибут, поэтому его можно записать двумя способами:
<!-- Полная запись --><input readonly="readonly"><!-- Сокращённая запись --><input readonly>
<!-- Полная запись -->
<input readonly="readonly">
<!-- Сокращённая запись -->
<input readonly>
В ARIA есть атрибут aria, который делает то же самое. Но лучше использовать нативный атрибут HTML, а ARIA применять только для элементов, где readonly не поддерживается:
<!-- ARIA для кастомных элементов --><custom-input aria-readonly="true"> Нередактируемый текст</custom-input>
<!-- ARIA для кастомных элементов -->
<custom-input aria-readonly="true">
Нередактируемый текст
</custom-input>
Где можно использовать
СкопированоАтрибут readonly работает с:
<textarea><input>следующих типов:textsearchurltelemailpassworddatemonthweektimedatetime- local number
Где не работает
СкопированоАтрибут readonly нельзя использовать с:
Также поле с readonly нельзя сделать обязательным через required.
Подсказки
Скопировано💡 Не путайте readonly с disabled. Неактивные поля (disabled) не получают фокус и не отправляются с формой, а поля только для чтения (readonly) — получают и отправляются.
💡 Для стилизации полей с readonly используйте псевдокласс :read, а для редактируемых полей — :read.
💡 В JavaScript можно проверить, доступно ли поле для редактирования, через свойство read:
💡 Поля с readonly всё ещё можно изменить через JavaScript или инструменты разработчика. Не используйте этот атрибут для защиты важных данных.
💡 Хотя поле с readonly можно выделить и получить на него фокус, пользователи не могут изменить его значение с клавиатуры.
💡 При отправке формы поля с readonly передаются на сервер, в отличие от полей с disabled.
💡 Атрибут readonly не влияет на события поля. Можно использовать все события, как с обычным полем.
На практике
Скопированосоветует
Скопировано🛠 Для улучшения UX добавляйте визуальную подсказку, что поле нельзя редактировать:
[readonly] { background-color: #f5f5f5; cursor: not-allowed;}
[readonly] {
background-color: #f5f5f5;
cursor: not-allowed;
}
🛠 Если нужно временно запретить редактирование поля, удобно переключать readonly через JavaScript:
const toggleReadOnly = (event) => { const input = document.querySelector('input') input.readOnly = !input.readOnly}
const toggleReadOnly = (event) => {
const input = document.querySelector('input')
input.readOnly = !input.readOnly
}