<input x-data x-mask="99/99/9999" placeholder="MM/DD/YYYY" />
Mask
Плагин Mask позволяет автоматически форматировать поле ввода текста по мере его набора пользователем.
Это удобно для различных типов входов: номера телефонов, кредитных карт, суммы в долларах, номера счетов, даты и т. д.
Установка
Вы можете использовать этот плагин, включив его из тега <script>
или установив с помощью менеджера пакетов.
Через CDN
Вы можете подключить CDN-сборку этого плагина с помощью тега <script>
, только подключать нужно ДО основного JS-файла Alpine.
<!-- Mask Plugin --><script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/mask@3/dist/cdn.min.js"></script>
<!-- Alpine Core --><script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js"></script>
<!-- Mask Plugin --><script defer src="https://unpkg.com/@alpinejs/mask@latest/dist/cdn.min.js"></script>
<!-- Alpine Core --><script defer src="https://unpkg.com/alpinejs@3/dist/cdn.min.js"></script>
Через менеджер пакетов
Вы можете установить Mask для использования внутри вашей сборки следующим образом:
npm i @alpinejs/mask
pnpm add @alpinejs/mask
yarn add @alpinejs/mask
Затем инициализируйте его в своей сборке:
import Alpine from 'alpinejs';import mask from '@alpinejs/mask';
Alpine.plugin(mask);Alpine.start();
x-mask
Основным API для использования этого плагина является директива x-mask
.
Для начала рассмотрим следующий простой пример поля даты:
Обратите внимание, что текст, вводимый в поле ввода, должен соответствовать формату, задаваемому x-mask
. Помимо принудительного ввода числовых символов, автоматически добавляются прямые косые черты /
, если пользователь не ввел их первым.
В масках поддерживаются следующие символы подстановки:
Знак подстановки | Описание |
---|---|
* | Любой символ |
a | Только буквенные символы (a-z, A-Z) |
9 | Только цифровые символы (0-9) |
Динамические маски
Иногда простых литералов масок (т. е. (999) 999-9999
) недостаточно. В этих случаях x-mask:dynamic
позволяет динамически генерировать маски «на лету» на основе пользовательского ввода.
Вот пример ввода данных о кредитной карте, который должен менять маску в зависимости от того, начинается ли номер с цифры «34» или «37» (что означает, что это карта Amex и, следовательно, имеет другой формат).
<input x-data x-mask:dynamic=" $input.startsWith('34') || $input.startsWith('37') ? '9999 999999 99999' : '9999 9999 9999 9999'"/>
Как видно из приведённого примера, каждый раз, когда пользователь вводит значение input, это значение передается в выражение как $input
. В зависимости от $input
в поле используется та или иная маска.
Попробуйте сами, набрав число, начинающееся с «34» и число, которое не начинается.
x-mask:dynamic
также принимает функцию в качестве результата выражения и автоматически передает ей $input
в качестве первого параметра. Например:
<input x-mask:dynamic="creditCardMask" />
<script> function creditCardMask(input) { return input.startsWith('34') || input.startsWith('37') ? '9999 999999 99999' : '9999 9999 9999 9999'; }</script>
Ввод денежных сумм
Поскольку написание собственного динамического выражения маски для ввода денежных сумм достаточно сложно, Alpine предлагает готовый вариант и предоставляет его в виде $money()
.
Здесь представлена полностью функционирующая маска ввода денежных сумм:
<input x-data x-mask:dynamic="$money($input)" placeholder="0.00" />
Если нужно поменять точки на запятые и наоборот (как это требуется в некоторых валютах), то это можно сделать с помощью второго необязательного параметра:
<input x-data x-mask:dynamic="$money($input, ',')" placeholder="0,00" />
Вы также можете переопределить разделитель тысяч, указав третий необязательный аргумент:
<input x-data x-mask:dynamic="$money($input, '.', ' ')" placeholder="3 000.00" />
Для отмены точности по умолчанию, равную 2 цифрам, используйте в качестве четвертого необязательного аргумента любое желаемое количество цифр:
<input x-data x-mask:dynamic="$money($input, '.', ',', 4)" placeholder="0.0001" />
Проверка знаний
-
С помощью какого модификатора задаётся динамическая маска?
-
Как указать сумму с запятой вместо точки?