【发布时间】:2021-06-14 19:14:14
【问题描述】:
我有一个带有 Ajax 调用的简单表单,但即使表单未经过验证,也会执行 ajax 调用。
在下面的代码行中,console.log("This line should execute only if Form is validated"); 在表单未验证时被执行。
Bootstrap 5 验证Codepen code
(function () {
"use strict";
const forms = document.querySelectorAll(".requires-validation");
Array.from(forms).forEach(function (form) {
form.addEventListener(
"submit",
function (event) {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
}
else
{
console.log("This line should execute only if Form is validated");
// Call Ajax Function
// AjaxCallSaveData();
}
form.classList.add("was-validated");
},
false
);
});
})();
//$(document).ready(function () {
function AjaxCallSaveData()
{
$("form").submit(function (event) {
var formData = {
name: $("#name").val(),
email: $("#email").val(),
message: $("#message").val(),
superheroAlias: $("#superheroAlias").val()
};
$.ajax({
type: "POST",
url: "SubmitFORM.php",
data: formData,
dataType: "json",
encode: true
}).done(function (data) {
console.log(data);
});
event.preventDefault();
});
}
//});
不确定我做得对吗?
HTML
<div class="form-body">
<div class="row">
<div class="form-holder">
<div class="form-content">
<div class="form-items">
<h3>Register you interest</h3>
<p>Fill in the data below, we will get back to you!</p>
<form class="requires-validation" action="SubmitFORM.php" method="POST" novalidate>
<div class="col-md-12 mb-3">
<input class="form-control" type="text" name="name" id="name" placeholder="Full Name" required>
<div class="valid-feedback">Username field is valid!</div>
<div class="invalid-feedback">Username field cannot be blank!</div>
</div>
<div class="col-md-12 mb-3">
<input class="form-control" type="email" name="email" id="email" placeholder="E-mail Address" required>
<div class="valid-feedback">Email field is valid!</div>
<div class="invalid-feedback">Email field cannot be blank!</div>
</div>
<div class="col-md-12 mb-3">
<textarea name="message" id="message" placeholder="Your Message"></textarea>
</div>
<div class="form-button mt-3">
<button id="submit" type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
【问题讨论】:
-
.preventDefault()和.stopPropagation()不会阻止下一行代码的执行。为此,您应该使用 return 语句。 -
@CuongLeNgoc,让我感到困惑的是,类似的代码在此示例中运行良好..codepen.io/KGuide/pen/poeQaqZ 控制台消息仅在验证表单时显示
-
@CuongLeNgoc,我注意到当我从表单标签中删除
novalidate时,控制台消息仅在表单经过验证时才会显示。 -
添加 return 只是打破验证并提交表单
-
如果你删除
novalidate,当from无效时,代码甚至不会运行附加到提交事件的函数,因为required或type="email"将阻止表单在无效时提交跨度>
标签: javascript jquery ajax bootstrap-5