Долгое время для отображения панели выбора даты приходилось прибегать к использованию пользовательских виджет-библиотек или хаков. Теперь веб-платформа поддерживает метод HTMLInputElement showPicker()
— канонический способ отображения панели выбора даты в браузере не только для дат, но и для времени, цвета и файлов.
Фон
Часто встречающийся запрос от веб-разработчиков:
Как мне программно
Переполнение стека
показать средство выбора для элементов управления, таких как дата?
Текущие ответы не очень хороши; они полагаются на внешние библиотеки, CSS-хаки или специфическое поведение браузера, например, имитацию взаимодействия пользователя с помощью click()
.
Рад сообщить, что эти времена скоро канут в Лету, поскольку веб-платформа представляет канонический способ отображения окна выбора браузера для элементов <input>
со следующими типами: "date"
, "month"
, "week"
, "time"
, "datetime-local"
, "color"
и "file"
. Это также будет работать для элементов <input>
с подсказками, основанными на <datalist>
или "autocomplete"
, о которых мы также поговорим в этой статье.

Как показать сборщик
Вызов showPicker()
для элемента <input>
отображает пользователю окно выбора браузера. Вызов должен быть вызван в ответ на действие пользователя, например, касание экрана или щелчок мыши; в противном случае возникнет ошибка с исключением NotAllowedError
. Из соображений безопасности при вызове в кросс-доменном iframe будет сгенерировано исключение SecurityError
.
Выбор браузера отображается, когда элемент <input>
имеет один из следующих типов: "date"
, "month"
, "week"
, "time"
, "datetime-local"
, "color"
или "file"
.
В примере ниже показано, как открыть окно выбора даты в браузере.
<input type="date">
<button>Show the date picker</button>
<script>
const button = document.querySelector("button");
const dateInput = document.querySelector("input");
button.addEventListener("click", () => {
try {
dateInput.showPicker();
// A date picker is shown.
} catch (error) {
// Use external library when this fails.
}
});
</script>
Выбор браузера также может быть предварительно заполнен элементами из <datalist>
или "autocomplete"
.
В примере ниже показано, как открыть окно выбора браузера с помощью <datalist>
.
<datalist id="ice-cream-flavors">
<option value="Chocolate"> </option>
<option value="Coconut"> </option>
<option value="Mint"> </option>
<option value="Strawberry"> </option>
<option value="Vanilla"> </option>
</datalist>
<input type="text" list="ice-cream-flavors">
<button>Show the suggestions</button>
<script>
const button = document.querySelector("button");
const iceCreamFlavorsInput = document.querySelector("input");
button.addEventListener("click", () => {
try {
iceCreamFlavorsInput.showPicker();
// A picker containing some ice cream flavors is shown.
} catch (error) {
// Use external library when this fails.
}
});
</script>
Обнаружение особенностей
Чтобы проверить, поддерживается ли showPicker()
, используйте:
if ('showPicker' in HTMLInputElement.prototype) {
// showPicker() is supported.
}
Демо
Демо-версия доступна по адресу https://cdpn.io/web-dot-dev/fullpage/LEVKVdr , где вы можете поиграть со всеми подборщиками, поддерживаемыми браузером.
Поддержка браузеров
showPicker()
доступен в Chrome 99 и более поздних версиях.
Что дальше?
На момент написания статьи функция showPicker()
была новой для веб-платформы. В будущем, возможно, потребуется доработка этой функции:
- В будущем мы, возможно, захотим добавить аналогичный
showPicker()
к элементу<select>
, если веб-разработчики попросят об этом. - Возможно,
closePicker()
может оказаться полезным, и мы могли бы рассмотреть возможность его добавления, если веб-разработчики попросят об этом. - Мы могли бы добавить политику разрешений , которая позволяет кросс-источниковым iframes показывать средства выбора браузера, если их родительская цепочка позволяет им это делать.
Обратная связь
Команда Chrome и сообщество веб-стандартов хотят узнать о вашем опыте работы с showPicker()
.
Расскажите нам о дизайне
Есть ли что-то в showPicker()
, что работает не так, как вы ожидали? Или отсутствуют методы или свойства, необходимые для реализации вашей идеи? Есть вопросы или комментарии по модели безопасности?
- Отправьте сообщение о проблеме со спецификацией в репозиторий WHATWG GitHub или добавьте свои мысли к существующей проблеме.
Проблема с реализацией?
Вы обнаружили ошибку в реализации Chrome? Или реализация отличается от спецификации?
- Сообщите об ошибке по адресу https://new.crbug.com . Опишите её как можно подробнее и предоставьте простые инструкции по её воспроизведению.
Показать поддержку
Планируете ли вы использовать showPicker()
? Ваша публичная поддержка помогает команде Chrome расставлять приоритеты в отношении функций и показывает другим разработчикам браузеров, насколько важна их поддержка.
Отправьте твит @ChromiumDev и расскажите, где и как вы его используете.
Полезные ссылки
- Документация MDN
- Объяснитель WHATWG
- Спецификация WHATWG
- Обзор TAG
- Демо | Источник демо
- Ошибка хрома
- Запись ChromeStatus.com
Благодарности
Благодарим Джо Медли за рецензирование этой статьи. Изображение для календаря предоставлено Эриком Ротермелем на Unsplash .