-1

我使用Bootstrap 4来验证“联系我”表单。

成功提交表单后,我将其重置为$('#contactForm').trigger("reset");清除输入字段,这些字段仍被标记为已验证(验证图标和绿色边框仍然存在)。

这会导致问题,因为我仅在验证所有输入后才启用提交按钮,并在提交后禁用它。但由于输入仍标记为“有效”,因此任何字段中的任何有效条目都将启用按钮,即使其他字段为空(所有字段均为“必填”)。

请告知如何在提交表格后清除验证。谢谢!

重要提示:
我使用Bootstrap 4。不是 3. 我之所以提到它,是因为我在 SO 和其他地方经历了几十个条目,大多数答案都指bootstrap.validator 哪一个不是我的情况!
再次感谢。

我的html:

<div class="container"><br>
  <div class="row">
    <div class="col-lg-8 mx-auto">
      <form id="contactForm" class="needs-validation" novalidate="novalidate">
        <div class="control-group">
          <div class="form-group">
            Name<input  type="text" id="name" class="form-control" pattern="^[a-zA-Z{1}[a-zA-Z-9 '\-]{1,29}$" required="required">
            <div class="invalid-feedback"><a>Error...</a></div>
          </div>
          <div class="form-group">
            Mail<input type="email" id="email" class="form-control" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}" required="required">
            <div class="invalid-feedback"><a>Error...</a></div>
          </div>
          <div class="form-group">
            Phone<input type="tel" id="phone" class="form-control" pattern="^[0-9\+]{1}[0-9\-]{9,17}$" required="required">
            <div class="invalid-feedback"><a>Error...</a></div>
          </div>
          <div class="form-group">
            Message<textarea type="text" id="message" class="form-control" rows="5" required="required"></textarea>
            <div class="invalid-feedback"><a>Error...</a></div>
          </div><br>
          <div id="phpMailerResult"></div>
          <div class="form-group text-center">
            <button id="sendMessageButton" type="submit" class="btn btn-success btn-xl text-dark font-weight-bold">Send</button>
          </div>
        </div>
      </form>
    </div>
  </div>
</div>

我的脚本:

$(document).ready(function() {
  // ------------------------ Actions on SUBMIT     --------------------
  $('#sendMessageButton').click(function(e) {
    e.preventDefault();
    var name = $("input#name").val();
    var email = $("input#email").val();
    var phone = $("input#phone").val();
    var message = $("textarea#message").val();
    $.ajax({
      url: "mail/contact_me.php",
      method: 'post',
      data: {
        name: name,
        phone: phone,
        email: email,
        message: message
      },
      cache: false,
      success:function() {
        $('#sendMessageButton').attr('disabled', true);
        var jsSuccess1 = "<div class='alert alert-success>";
        var jsSuccess2 = "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;";
        var jsSuccess3 = "</button>";
        var jsSuccess4 = "<strong>Message sent successfully!</strong>";
        var jsSuccess5 = "</div>";
        $('#phpMailerResult').html(jsSuccess1);
        $('#phpMailerResult > .alert-success').append(jsSuccess2, jsSuccess3, jsSuccess4, jsSuccess5);
        $('#contactForm').trigger("reset");
      },
      error:function() {
        $('#sendMessageButton').attr('disabled', true);
        var jsFail1 = "<div class='alert alert-danger>";
        var jsFail2 = "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;";
        var jsFail3 = "</button>";
        var jsFail4 = "<strong>Something went wrong...!</strong>";
        var jsFail5 = "</div>";
        $('#phpMailerResult').html(jsFail1);
        $('#phpMailerResult > .alert-danger').append(jsFail2, jsFail3, jsFail4, jsFail5);
      },
    });
    return true;
  });
  // ----------------- Validate  CONTACT form on input -----------------
  let jsContactForm = document.getElementById('contactForm');
  jsContactForm.querySelectorAll('.form-control').forEach(jsContactInput => {
    jsContactInput.addEventListener(('input'), () => {
      if (jsContactInput.checkValidity()) {
        jsContactInput.classList.add('is-valid');
        jsContactInput.classList.remove('is-invalid');
      } else {
        jsContactInput.classList.add('is-invalid');
        jsContactInput.classList.remove('is-valid');
      }
      let jsIsValid = $(jsContactForm.querySelectorAll('.form-control')).length === $(jsContactForm.querySelectorAll('.form-control.is-valid')).length;
      if (jsIsValid) {
        $('#sendMessageButton').attr('disabled', false);
      } else {
        $('#sendMessageButton').attr('disabled', true);
      }
    });
  });
});
4

1 回答 1

2

我很高兴(也很自豪)自己解决了这个问题!

在脚本的“提交操作”部分中,我添加了一些行(我在以下代码段中用<===标记了这些行,以便更容易看到)。

现在成功提交后,输入字段被清除,既不标记为有效也不标记为无效,因此可以重新开始发送联系我表单的新周期。

这是代码的修改部分(其余代码没有更改):

  // ------------------------ Actions on SUBMIT     --------------------
  $('#sendMessageButton').click(function(e) {
    e.preventDefault();
    $('#phpMailerResult').show();                      // <===
    var name = $("input#name").val();
    var email = $("input#email").val();
    var phone = $("input#phone").val();
    var message = $("textarea#message").val();
    $.ajax({
      url: "mail/contact_me.php",
      method: 'post',
      data: {
        name: name,
        phone: phone,
        email: email,
        message: message
      },
      cache: false,
      success:function() {
        $('#sendMessageButton').attr('disabled', true);
        var jsSuccess1 = "<div class='alert alert-success myHeight22'>";
        var jsSuccess2 = "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;";
        var jsSuccess3 = "</button>";
        var jsSuccess4 = "<strong>Message sent successfully!</strong>";
        var jsSuccess5 = "</div>";
        $('#phpMailerResult').html(jsSuccess1);
        $('#phpMailerResult > .alert-success').append(jsSuccess2, jsSuccess3, jsSuccess4, jsSuccess5);
        $('#contactForm').trigger("reset");
        let jsContactForm = document.getElementById('contactForm');                   // <=== 
        jsContactForm.querySelectorAll('.form-control').forEach(jsContactInput => {   // <===
          jsContactInput.classList.remove('is-valid');                                // <===
          jsContactInput.classList.remove('is-invalid');                              // <===
          jsContactInput.addEventListener(('keyup'), () => {                          // <===
            $('#phpMailerResult').hide();                                             // <===
          });                                                                         // <===
        });                                                                           // <===
      },
      error:function() {
        $('#sendMessageButton').attr('disabled', true);
        var jsFail1 = "<div class='alert alert-danger myHeight22'>";
        var jsFail2 = "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;";
        var jsFail3 = "</button>";
        var jsFail4 = "<strong>Something went wrong...!</strong>";
        var jsFail5 = "</div>";
        $('#phpMailerResult').html(jsFail1);
        $('#phpMailerResult > .alert-danger').append(jsFail2, jsFail3, jsFail4, jsFail5);
      },
    });
    return true;
  });
于 2019-12-02T11:20:45.620 回答