У меня есть форма, в которой я прошу электронное письмо, которое я проверяю с помощью регулярного выражения, если электронное письмо верное, я отправляю, если нет, я отправляю предупреждение.
Когда я помещаю недействительный адрес электронной почты, отображается предупреждение, но если я помещаю действительный адрес электронной почты, отображается предупреждение, а затем выполняется submit (), я даже не знаю, как это возможно! Вот мой код.
$('#sinCopago').on('click', function(event){
if ($('#nombreContratante').val() != "" && $('#motivo').val() != ""){
if ($('#fechaNac').val() > hoy){
alert("Ingresa una fecha de nacimiento válida.");
}else{
if (validarMail($("#correo")) == true){
event.preventDefault();
$('#progressBarSisnova').modal({show:true});
$('#payment-form-Sisnova').submit();
}
else{
alert("Ingresa un correo válido");
}
}
}
else{
alert("Por favor llene todos los campos");
}
});
function validarMail(email){
var caract = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;
if (caract.test(email) == false){
return false;
}
else{
return true;
}
}
Оффтоп, но чувак, постарайся сохранить шаблон. В некоторых местах у вас есть else на той же строке, что и закрывающие скобки из if, в других местах вы разрываете строку. Это затрудняет чтение вашего кода
Ваше регулярное выражение слишком ограничительно. См. этот ответ о проверке адресов электронной почты. Лично я предпочитаю проверить наличие .@., а затем запрос DNS на запись MX в указанном домене. Если оба из них пройдут, я полагаю, что адрес правильный.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В настоящее время вы передаете объект jQuery $("#correo") в validarMail:
if (validarMail($("#correo")) == true){
и переходим к тесту этот объект:
if (caract.test(email) == false){
Что, конечно, не сработает, потому что вы не тестируете строку. Попробуйте вместо этого передать .val() из #correo. так что возможный .test( вызывается с строка значения, а не с объектом jQuery:
if (validarMail($("#correo").val()) == true){
Не стесняйтесь удалять часть == true, validarMail уже возвращает логическое значение:
if (validarMail($("#correo").val())){
Вам также следует preventDefaultкогда тест не проходит, а не тогда, когда тест завершится успешно - в этом случае форма будет отправлена как обычно, без прерывания, только когда тест завершится успешно. Код также, вероятно, будет более плоским и легче читается, если вы используете return, когда есть ошибка:
$('#sinCopago').on('click', function(event){
if ($('#nombreContratante').val() === "" || $('#motivo').val() === "") {
event.preventDefault();
return alert("Por favor llene todos los campos");
}
if ($('#fechaNac').val() <= hoy){
event.preventDefault();
return alert("Ingresa una fecha de nacimiento válida.");
}
if (!validarMail($("#correo").val())){
event.preventDefault();
return alert("Ingresa un correo válido");
}
$('#progressBarSisnova').modal({show:true});
$('#payment-form-Sisnova').submit();
});
Если при нажатии на #sinCopago форма отправляется без preventDefault, то в последней строке $('#payment-form-Sisnova').submit(); нет необходимости. (В противном случае в preventDefault может вообще не быть необходимости, если действие по умолчанию для события не вызывает отправку формы или другое нежелательное поведение)
Думаю, мы можем закрыть это как опечатку?
вы должны передать значение поля для функции validarMail(), поэтому замените текущий код
if (validarMail($("#correo")) == true)
за
if (validarMail($("#correo").val()) == true)
и вы можете улучшить свою функцию.
function validarMail(email){
var caract = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;
return caract.test(email)
}
Обработка щелчка не предотвратит отправку формы, если вы либо а) не добавите
event.preventDefault();в свою функцию, либо б) не вернете из нее false.