Маска телефона ломает отправку формы: где искать ошибку
Маска телефона кажется маленькой frontend-деталью, но она легко ломает форму. Пользователь видит красивый номер, нажимает “Отправить”, а заявка не уходит, телефон приходит пустым, сервер отклоняет данные или CRM получает номер в странном формате.
Маска должна помогать вводу, но настоящая проверка телефона всё равно должна быть на сервере. JavaScript в браузере — это удобство, а не источник истины.
Проверить name у input
Самая простая ошибка: поле визуально есть, но у него нет name. Тогда браузер не отправит его в форме.
<input type="tel" id="phone" placeholder="+7 (___) ___-__-__">
Правильно:
<input type="tel" name="phone" id="phone" placeholder="+7 (___) ___-__-__">
Если форма отправляется через AJAX, name тоже важен, если данные собираются через FormData.
disabled-поля не отправляются
Если поле disabled, оно не попадёт в отправку формы. Иногда разработчики ставят disabled во время инициализации маски и забывают снять.
<input type="tel" name="phone" disabled>
Если поле должно быть недоступно для редактирования, но отправляться, используют readonly, а не disabled.
Проверить FormData
Для AJAX-формы можно быстро посмотреть, какие данные реально собираются.
const formData = new FormData(form);
for (const [key, value] of formData.entries()) {
console.log(key, value);
}
Если phone там нет, проблема не на сервере. Нужно смотреть HTML, name, disabled, вложенность input внутри form.
JS-валидация
Маска часто проверяет не фактический номер, а заполненность шаблона. Из-за этого валидный номер может отклоняться, если формат отличается от ожидаемого.
+7 (999) 000-00-00
Но пользователь может вводить номер в другом формате, особенно если сайт работает не только с российскими телефонами. Не стоит делать маску жестче бизнес-требований.
Нормализация на сервере
На backend лучше привести телефон к единому виду: убрать пробелы, скобки, дефисы и проверить количество цифр.
$phone = $_POST['phone'] ?? '';
$digits = preg_replace('/\D+/', '', $phone);
if (strlen($digits) < 10) {
throw new RuntimeException('Некорректный телефон');
}
Сохранять можно нормализованный номер и исходное значение, если оно нужно для отображения.
Скрытое поле с чистым номером
Иногда удобно иметь видимое поле с маской и скрытое поле с нормализованным номером. Но важно не запутаться, какое поле отправляется в CRM.
<input type="tel" id="phone_masked">
<input type="hidden" name="phone" id="phone_clean">
Перед отправкой JS должен заполнить hidden-поле. Если скрипт упал, phone_clean будет пустым. Поэтому серверная проверка всё равно обязательна.
Маска и автозаполнение
Браузерное автозаполнение может конфликтовать с маской. Пользователь выбирает номер из сохранённых данных, визуально он есть, но скрипт не обновил внутреннее значение.
Проверять форму нужно не только ручным вводом, но и autofill, мобильной клавиатурой, копированием номера из буфера.
Мобильные устройства
Для телефона лучше использовать type="tel". Это не валидирует номер, но открывает удобную клавиатуру на мобильных.
<input type="tel" name="phone" autocomplete="tel">
autocomplete помогает браузеру подставлять номер, но не заменяет проверку.
Ошибка в CRM или письме
Если сервер получил номер, а CRM нет, проблема уже не в маске. Нужно проверить маппинг полей, шаблон письма, API-запрос или обработчик формы.
[
'PHONE' => $digits,
]
Частая ошибка: backend принимает phone, а интеграция отправляет user_phone или PHONE_WORK, которого внешний сервис не ждёт.
Чек-лист
- Проверить name у поля телефона.
- Убедиться, что input не disabled.
- Посмотреть FormData перед отправкой.
- Проверить JS-валидацию на разных форматах номера.
- Нормализовать телефон на сервере.
- Не доверять только frontend-маске.
- Проверить autofill, mobile и copy-paste.
- Проверить маппинг телефона в CRM или письме.
Маска телефона должна быть тонким слоем удобства. Если от неё зависит сама возможность отправить заявку, форма становится хрупкой. Надёжный вариант — простая маска, понятная серверная проверка и проверенный путь номера до CRM или письма.
Комментарии (0)
Пока нет комментариев. Будьте первым!