Валидация полей для ввода
Как реализовать что бы при потере фокуса происходила проверка на корректность введённого значения и замена его на корректное при необходимости по следующим правилам:
Из строки значения должны удаляться все символы, кроме допустимых. Пробелы и дефисы в начале и конце значения должны удаляться. Несколько идущих подряд пробелов или дефисов должны заменяться на один. Первая буква должна приводиться к верхнему регистру, а все остальные — к нижнему. В настоящее время реализован только перевод первой буквы в верхний регистр и запрещен ввод латиницы. <form id="form" onsubmit="return false;"> <input type="text" class="validation" id='surname' placeholder="Фамилия" /> <input type="text" class="validation" id='name' placeholder="Имя" /> <input type="text" class="validation" id='patronymic' placeholder="Отчество" /> <button id="button" class="btn btn-success" >Отправить</button> </form> let surname = document.getElementById("surname") let inputName = document.getElementById("name") let patronymic = document.getElementById("patronymic") let button = document.getElementById("button") let form = document.getElementById("form") let p = document.createElement('p'); let inp = document.querySelector('.validation') let surnameStr = inp.textContent function validation(inp) { inp.addEventListener('input', function () { this.value = this.value.replace(/[^А-Яа-яЁё -]/g, '') function changeStr(surnameStr) { surnameStr.replace(/\s+/g, ' ') surnameStr.replace(/^([-=\s]*)([a-zA-Z0-9])/gm, "$2") if (!surnameStr) return surnameStr; return surnameStr[0].toUpperCase() + surnameStr.slice(1) } changeStr() }) } validation(surname) validation(inputName) validation(patronymic) document.forms[0].addEventListener('change', function (e) { if (e.target.tagName = 'INPUT') e.target.value = e.target.value.charAt(0).toUpperCase() + e.target.value.slice(1) }) button.onclick = function() { let text = surname.value + ' ' + inputName.value + ' ' + patronymic.value; p.innerHTML = text; form.append(p) }; |
Цитата:
const val = ' -пример ---' const re = /^[\s-]*|[\s-]*$/g alert(val.replace(re, '')) |
Цитата:
const val = '> - - пример ---' let re = /(\s){2,}/g alert(val.replace(re, '$1')) re = /(-){2,}/g alert(val.replace(re, '$1')) |
replace не меняет исходную строку, а возвращает новую с заменами
Строки 20 - 21 должны быть так surnameStr = surnameStr .replace(/\s+/g, ' ') .replace(/^([-=\s]*)([a-zA-Z0-9])/gm, "$2") Для удаления пробелов вначале и конце trim() |
Цитата:
const val = '> - - пример 123 NG ---' const re = /[123NG]/g alert(val.replace(re, '')) |
валидация формы
Paulsw01,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script> document.addEventListener("DOMContentLoaded", function() { const form = document.getElementById("form"); function validation(input) { let txt = input.value.trim(); let reg = /(^[^А-Яа-яЁё]+)|([^А-Яа-яЁё]+$)/g; txt = txt.replace(reg, ''); reg = /[-\s]+/g; txt = txt.replace(reg, ([a, ...b]) => a); reg = /[^А-Яа-яЁё\s-]/g; txt = txt.replace(reg, ''); txt = txt.toLowerCase(); reg = /^./; txt = txt.replace(reg, a => a.toUpperCase()); if (txt !== input.value) input.value = txt; return !!txt.length; } form.addEventListener("focusout", function({ target }) { if (target = target.closest(".validation")) validation(target) }) let timer; form.addEventListener("submit", function(event) { event.preventDefault(); let inputs = Array.from(this.querySelectorAll(".validation")); let validate = inputs.every(validation); let txt = "Не все поля заполнены правильно!" if (validate) txt = inputs.map(({ value }) => value).join(" "); out.innerHTML = txt; window.clearTimeout(timer); if (!validate) timer = window.setTimeout(_ => out.innerHTML = "", 10000) }) }); </script> </head> <body> <p id="out"></p> <form id="form" > <input type="text" class="validation" id='surname' placeholder="Фамилия" /> <input type="text" class="validation" id='name' placeholder="Имя" /> <input type="text" class="validation" id='patronymic' placeholder="Отчество" /> <button id="button" class="btn btn-success">Отправить</button> </form> </body> </html> |
Ну нельзя же так!
рони, не учи плохому. Показывать сообщение на 2 сек! А что, человек не имеет права отвернуться? глаза прикрыть после тяжкого ввода? Моргнул, не увидел сообщения и довольный сидишь ждешь до посинения. |
voraa,
что мешает время показа увеличить(строка 41 параметр 2000) или отменить(закомментируйте строки 40-41), сделав свой вывод ошибок. ))) |
рони, Ничего не мешает.
Просто, имея больший опыт, не надо показывать такие примеры. Вообще грамотным интерфейсам надо учить и учить. А то столько кошмара приходится видеть. |
voraa,
не понимаю, увеличил время показа до 10 секунд. |
Часовой пояс GMT +3, время: 16:17. |