#javascript #инспекция_кода #валидация
Я новичок в javascript, и у меня есть вопрос. У меня есть код с проверкой на валидность
заполнение регистрационной формы. Я думал как ее можно упростить и пришел к выводу,
что нужно создать отдельный метод и туда передавать нужные мне параметры, но столкнулся
с проблемой, что не знаю с какого места их лучше передавать. Как это сделать лучше
и правильно?
var namePattern = new RegExp("^([A-z]{4,20})$");
var emailPattern = new RegExp("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,5})$");
var passwordPattern = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,20}$");
document.getElementById("registration_form").addEventListener("submit", function(event) {
var fName = document.getElementById("fName").value;
var lName = document.getElementById("lName").value;
var email = document.getElementById("email").value;
var password = document.getElementById("pass").value;
var confirmPassword = document.getElementById("confPass").value;
document.getElementById("error_first_name").innerHTML = '';
document.getElementById("error_last_name").innerHTML = '';
document.getElementById("error_email").innerHTML = '';
document.getElementById("error_password").innerHTML = '';
document.getElementById("error_confirmPassword").innerHTML = '';
if (!namePattern.test(fName)) {
document.getElementById("error_first_name").innerHTML = 'Wrong first name! range:
[4-20] and not contain numbers';
event.preventDefault();
} if (!namePattern.test(lName)) {
document.getElementById("error_last_name").innerHTML = 'Wrong last name! range:
[4-20] and not contain numbers';
event.preventDefault();
} if(!emailPattern.test(email)){
document.getElementById("error_email").innerHTML = 'Wrong email! Your email should
contains this symbols: [-_A-z0-9]';
event.preventDefault();
} if(!passwordPattern.test(password)){
document.getElementById("error_password").innerHTML = 'Wrong password! range:
[8-20], minimum one upper case letter: [A] and minimum one figure';
event.preventDefault();
} if(confirmPassword != password){
document.getElementById("error_confirmPassword").innerHTML = 'Your passwords
do not match';
event.preventDefault();
}
})
Моя форма:
Я пытаюсь уменьшить свой код, для этого я создал функцию, в которой передаю все параметры,
которые мне нужны, но что я не делаю правильно. Теперь это выглядит так.
var namePattern = new RegExp("^([A-z]{4,20})$");
var emailPattern = new RegExp("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,5})$");
var passwordPattern = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,20}$");
document.getElementById("registration_form").addEventListener("submit", function(event){
function getParam(value, pattern, error_value, error_message){
error_value.innerHTML = '';
if(!pattern.test(value)){
error_value.innerHTML = error_message;
event.preventDefault();
}
}
})
Но то, что я делаю, неверно, как я могу улучшить его и правильно передать мои параметры?
Нужно ли передавать их с помощью html или как лучше будет это реализовать?
Ответы
Ответ 1
Все с комментариями. Примечание: элементы ошибок должны начинатся с error_ и дальше должно быть написано имя поля которое в errorInfo(first_name, last_name и т.д), то есть быть вот таким: error_first_name, error_last_name и т.д var namePattern = new RegExp("^([A-z]{4,20})$"); var emailPattern = new RegExp("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,5})$"); var passwordPattern = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,20}$"); document.getElementById("registration_form").addEventListener("submit", function(event) { event.preventDefault(); // достаточно написать один раз var fName = document.getElementById("fName").value; var lName = document.getElementById("lName").value; var email = document.getElementById("email").value; var password = document.getElementById("pass").value; var confirmPassword = document.getElementById("confPass").value; // набор полей ошибок var errorInfo = { first_name: { // имя поля(потом находит элемент по нему document.getElementById('error_' + name)) // валидное ли поле? если true то не будет ошибки validity: namePattern.test(fName), // сообщение об ошибке text: 'Wrong first name! range: [4-20] and not contain numbers' }, last_name: { validity: namePattern.test(lName), text: 'Wrong last name! range: [4-20] and not contain numbers' }, email: { validity: emailPattern.test(email), text: 'Wrong email! Your email should contains this symbols: [-_A-z0-9]' }, password: { validity: passwordPattern.test(password), text: 'Wrong password! range: [8-20], minimum one upper case letter: [A] and minimum one figure' }, confirmPassword: { validity: confirmPassword === password, text: 'Your passwords do not match' } } // перебирает errorInfo, name - имя поля(ключ объекта errorInfo) for (let name in errorInfo) { var errorMsg = ''; // текст ошиьки, изначально ставит ошибку как ее нет // если поле не валидное if (!errorInfo[name].validity) errorMsg = errorInfo[name].text; // ставит текст ошибки // ставит текст ошибки (innerHTML медленее textContent) document.getElementById('error_' + name).textContent = errorMsg; } })
Ответ 2
Все маски можно ввести в data- атрибуты (о бессмысленности валидации e-mail регекспом можно почитать, например здесь) Тексты ошибок можно вписать на страницу заранее и просто показывать/прятать блок Все инпуты можно перебрать в цикле как дочерние к элементу
-
document.getElementById("registration_form").addEventListener("submit", function(event) {
var blocks = this.querySelectorAll('ul');
for (var i = 0; i < blocks.length; i++) {
var input = blocks[i].querySelector('input');
var msg = blocks[i].querySelector('.error');
var pattern = input.getAttribute('data-pattern');
var valid = false;
if (pattern !== null) {
var re = new RegExp(pattern);
valid = re.test(input.value);
} else
valid = input.value == document.getElementById('pass').value;
if (!valid) {
msg.style.display = 'block';
event.preventDefault();
} else
msg.style.display = 'none';
}
})
.error {
color: #ff0000;
display: none;
}
Комментариев нет:
Отправить комментарий