【问题标题】:Form validation with Ajax call triggers when not validation未验证时使用 Ajax 调用触发表单验证
【发布时间】: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无效时,代码甚至不会运行附加到提交事件的函数,因为requiredtype="email"将阻止表单在无效时提交跨度>

标签: javascript jquery ajax bootstrap-5


【解决方案1】:

event.preventDefault() 只会阻止表单提交。它无法阻止 JavaScript 函数的下一行执行。

您应该使用return 代替event.preventDefault()

【讨论】:

  • 让我感到困惑的是,类似的代码在这个例子中运行良好..codepen.io/KGuide/pen/poeQaqZ 控制台消息仅在表单验证时显示
  • 我注意到,当我从表单标签中删除 novalidate 时,控制台消息仅在表单经过验证时才显示,因此第二个示例工作正常,当我们添加自定义错误消息时,它无法按预期工作
  • @Learning 在这个例子中你也会遇到同样的问题。无论输入正确或错误,AJAX 请求都会发送。但是,除非值正确,否则表单不会submit
  • @Learning 您将AJAX POST request 与普通形式POST 混淆了。
  • 我试过了,它不起作用..我只是想在客户端验证成功时通过 Ajax 调用提交表单......我很感激你可以分享你认为可行的方法
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多