У меня есть поле электронной почты, которое должно проверять домен электронной почты каждый раз, когда пользователь изменяет значение. Мой код не работает, как ожидалось. Поле ввода будет активировано на blur
, copy
и paste
. После этого введенное значение будет проверено, и сообщение будет установлено в поле атрибута данных. Вот пример моего кода:
var COMMON_FUNC = {};
COMMON_FUNC.verifyFields = function(containerID, includeInvisible) {
includeInvisible = includeInvisible || false;
let isValid = true;
const hdlMap = {
//'valueMissing': "This field is required",
//'patternMismatch': "This field is invalid",
'tooLong': "This field is too long",
'rangeOverflow': "This field is greater than allowed maximum",
'rangeUnderflow': "This field is less than allowed minimum",
'typeMismatch': "This field is mistyped"
};
const arrV = Object.keys(hdlMap);
const invalidInputs = [];
$("#" + containerID).find("input,textarea,select").each(function() {
var curItem$ = $(this);
var errMsg = [];
var dispfld = curItem$.data("dispfld");
var label = curItem$.data("label");
if (includeInvisible || curItem$.is(":visible")) {
if (curItem$[0].validity.valid) {
curItem$.removeClass("is-invalid");
return;
}
if (curItem$[0].validity['valueMissing'] && label) {
var reqMsg = label ? label + " field is required" : "This field is required";
errMsg.push(reqMsg);
}
if (curItem$[0].validity['customError'] && dispfld) {
errMsg.push(dispfld);
}
if (curItem$[0].validity['patternMismatch'] && dispfld) {
errMsg.push(dispfld);
}
arrV.forEach(function(prop) {
if (curItem$[0].validity[prop]) {
errMsg.push(hdlMap[prop]);
}
});
if (errMsg.length) {
if (!curItem$.next().is(".invalid-feedback")) {
curItem$.after('<div class="invalid-feedback"></div>');
}
curItem$.addClass("is-invalid").next().text(errMsg.join(' and '));
invalidInputs.push(curItem$);
isValid = false;
} else {
curItem$.removeClass("is-invalid");
}
}
});
if (invalidInputs.length) {
invalidInputs[0].focus();
}
return isValid;
};
$(".save").on("click", function() {
if (COMMON_FUNC.verifyFields("my-form")) {
alert("Record has been saved!");
}
});
$(".email").on("blur copy paste", function() {
var fldElement = $(this);
var objData = {
'email': fldElement.val(),
'type': fldElement.data('type')
};
var validEmails = ["test@gmail.com", "test@yahoo.com", "test@home.org"];
var resultArr = [];
if (fldElement.val()) {
if (!validEmails.includes(fldElement.val())) {
resultArr.push('This email ' + fldElement.val() + ' is invalid');
}
console.log(resultArr);
if (resultArr.length) {
if (!fldElement.next().is(".invalid-feedback")) {
fldElement.after('<div class="invalid-feedback"></div>');
}
fldElement.attr("data-dispfld", resultArr.join(' and '));
fldElement[0].setCustomValidity(resultArr.join(' and '));
} else {
fldElement.removeClass("is-invalid");
}
}
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<html>
<head>
<title>Validate Email</title>
</head>
<body>
<form name="my-form" id="my-form">
<div class="form-group">
<label for="email">Agency Manager Email:</label>
<input class="form-control email" type="email" name="email" id="email" value="" data-type="Manager Email" maxlength="40" data-label="Manager Email" required="">
</div>
<button type="button" class="btn btn-secondary save">Save</button>
</form>
</body>
</html>
Если вы запустите приведенный выше пример кода и введете случайное электронное письмо, например ryan@homes.com
и нажмете Save
, вы увидите сообщение о том, что электронное письмо недействительно. Если после этого вы введете другой недействительный адрес электронной почты, в сообщении будет отображаться все еще предыдущее сообщение. Я не уверен, почему, так как массив, который содержит сообщения об ошибках, обновляется. Это должно быть связано с методом setCustomValidity()
. Если кто-нибудь знает, как решить эту проблему, пожалуйста, дайте мне знать. Спасибо.