카테고리 없음
폼검증2
hg_96
2023. 8. 11. 10:56
폼검증을 조금 수정했다 여기서 조금 미완성인 부분이 틀렸을때 보여줘야하는 텍스트 대상을 완벽하게 못잡는거다
class FormValidator {
constructor(form, fields) {
this.form = form;
this.fields = fields;
}
initialize() {
this.validateOnEntry(); // 실시간 감지
// this.validateOnSubmit();
this.validateOnSubmit2();
}
initialize_nullTrue() {
this.validateOnEntry(true); // 실시간 감지
// this.validateOnSubmit();
this.validateOnSubmit2(true);
}
validateOnSubmit() {
let self = this;
this.form.addEventListener("submit", (e) => {
e.preventDefault();
self.fields.forEach((field) => {
const input = document.getElementsByName(`${field}`);
if (input[0].type == "checkbox") {
self.validateFields_Checkbox(input[0], field);
} else if (input[0].type == "select-one") {
self.validateFields_Selectbox(input[0]);
} else {
self.validateFields(input);
}
});
});
}
validateOnSubmit2(isnull = false) {
// e.preventDefault();
let self = this;
self.fields.forEach((field) => {
const input = document.getElementsByName(`${field}`);
if (input[0]) {
if (input[0].type == "checkbox") {
self.validateFields_Checkbox(input[0], field, isnull);
} else if (input[0].type == "select-one") {
self.validateFields_Selectbox(input[0], isnull);
} else {
self.validateFields(input, isnull);
}
}
});
}
validateOnEntry(isnull = false) {
let self = this;
this.fields.forEach((field) => {
const input = document.getElementsByName(`${field}`);
if (input[0]) {
if (input[0].type == "checkbox") {
input[0].addEventListener("input", (event) => {
self.validateFields_Checkbox(input[0], field, isnull);
});
} else if (input[0].type == "select-one") {
input[0].addEventListener("input", (event) => {
self.validateFields_Selectbox(input[0], isnull);
});
} else {
input[0].addEventListener("input", (event) => {
self.validateFields(input, isnull);
});
}
}
});
}
validateFields(fields, isnull = false) {
let formval_min = fields[0].getAttribute("formval_min");
let formval_max = fields[0].getAttribute("formval_max");
fields.forEach((field) => {
if (field.value.trim() === "" && !isnull) {
this.setStatus(field, `${field.parentElement.parentElement.querySelector("label").innerText} 을/를 입력해주세요`, "error");
} else {
if (field.value.trim() !== "") {
this.setStatus(field, null, "success");
}
if (field.type === "text") {
if (formval_max && formval_min) {
if (formval_max < field.value.trim().length || formval_min > field.value.trim().length) {
this.setStatus(field, formval_min + "자 이상 " + formval_max + "자 이하로 입력해주세요.", "error");
}
} else {
if (formval_min) {
if (formval_min > field.value.trim().length) {
this.setStatus(field, formval_min + "자 이상 입력해주세요.", "error");
}
}
if (formval_max) {
if (formval_max < field.value.trim().length) {
this.setStatus(field, formval_max + "자 이하로 입력해주세요.", "error");
}
}
}
let formcnt_min = fields[0].getAttribute("formcnt_min");
let formcnt_max = fields[0].getAttribute("formcnt_max");
let extractedNumber_Input = parseInt(field.value.trim().replace(/[^0-9.-]+/g, ""));
let extractedNumber_Min
let extractedNumber_Max
if (formcnt_min) {
extractedNumber_Min = parseInt(formcnt_min.replace(/[^0-9.-]+/g, ""));
}
if (formcnt_max) {
extractedNumber_Max = parseInt(formcnt_max.replace(/[^0-9.-]+/g, ""));
}
if (formcnt_min && formcnt_max) {
if (extractedNumber_Max < extractedNumber_Input || extractedNumber_Min > extractedNumber_Input) {
this.setStatus(field, formcnt_min + " 이상 " + formcnt_max + " 이하로 입력해주세요.", "error");
}
} else {
if (formcnt_min) {
if (extractedNumber_Min > extractedNumber_Input) {
this.setStatus(field, formcnt_min + " 이상 입력해주세요.", "error");
}
}
if (formcnt_max) {
if (extractedNumber_Max < extractedNumber_Input) {
this.setStatus(field, formcnt_max + " 이하로 입력해주세요.", "error");
}
}
}
}
if (field.type === "email") {
const re = /\S+@\S+\.\S+/;
if (re.test(field.value)) {
this.setStatus(field, null, "success");
} else {
this.setStatus(field, "이메일 형식이 맞지 않습니다.", "error");
}
}
if (field.id === "password_confirmation") {
const passwordField = this.form.querySelector("#password");
if (field.value.trim() == "") {
this.setStatus(field, "비밀번호를 입력해주세요.", "error");
} else if (field.value != passwordField.value) {
this.setStatus(field, "비밀번호 두개가 일치하지 않습니다.", "error");
} else {
this.setStatus(field, null, "success");
}
}
}
});
}
validateFields_Checkbox(field, checkboxName, isnull = false) {
const selectedCheckboxLength = document.querySelectorAll(`input[name="${checkboxName}"]:checked`).length;
let formval_min = field.getAttribute("formval_min");
let formval_max = field.getAttribute("formval_max");
if (selectedCheckboxLength == 0 && !isnull) {
this.setStatus(field, `${field.parentElement.parentElement.querySelector("label").innerText} 을/를 선택해주세요`, "error");
} else {
this.setStatus(field, null, "success");
}
if (formval_max && formval_min) {
if (formval_max < selectedCheckboxLength || formval_min > selectedCheckboxLength) {
this.setStatus(field, formval_min + "개 이상 " + formval_max + "개 이하로 선택해주세요.", "error");
}
} else {
if (formval_min) {
if (formval_min > selectedCheckboxLength) {
this.setStatus(field, formval_min + "개 이상 선택해주세요.", "error");
}
}
if (formval_max) {
if (formval_max < selectedCheckboxLength) {
this.setStatus(field, formval_max + "개 이하로 선택해주세요.", "error");
}
}
}
}
validateFields_Selectbox(field, isnull = false) {
if (field.value.trim() === "" && !isnull) {
this.setStatus(field, `${field.previousElementSibling.previousElementSibling.innerText} 을/를 선택해주세요`, "error");
} else {
this.setStatus(field, null, "success");
}
}
setStatus(field, message, status) {
const successIcon = field.parentElement.querySelector(".iconSuccess") ? field.parentElement.querySelector(".iconSuccess") : field.parentElement.parentElement.querySelector(".iconSuccess");
const errorIcon = field.parentElement.querySelector(".iconError") ? field.parentElement.querySelector(".iconError") : field.parentElement.parentElement.querySelector(".iconError");
const errorMessage = field.parentElement.querySelector(".errorMessage") ?
field.parentElement.querySelector(".errorMessage") :
field.parentElement.parentElement.querySelector(".errorMessage");
if (status === "success") {
if (errorIcon) {
errorIcon.classList.add("hidden");
}
if (errorMessage) {
errorMessage.innerText = "";
}
if (successIcon) {
successIcon.classList.remove("hidden");
}
field.classList.remove("input-error");
}
if (status === "error") {
if (successIcon) {
successIcon.classList.add("hidden");
}
errorMessage.innerText = message;
errorIcon.classList.remove("hidden");
field.classList.add("input-error");
}
}
}