При нажатии кнопки «Отправить» в моей веб-форме, как появляются ошибки проверки для полей ввода, даже если эти поля имеют значения? - PullRequest
0 голосов
/ 04 марта 2019

При тестировании моей веб-формы, созданной с использованием HTML, CSS, Bootstrap, PHP и jQuery, в первую очередь я нажимаю кнопку «Отправить».Когда я это делаю, ошибки текстовой опасности отображаются ниже полей ввода и области текста, как и ожидалось, поскольку поля пусты.Если я добавлю значение в поле ввода «Имя» и снова нажму кнопку «Отправить», поле опасности текста будет продолжать отображаться под полем «Имя».То же самое происходит, когда я пытаюсь сделать то же самое для полей Email и Security Check.

Когда я добавляю значение в поле Text Text Area, ошибка текстовой опасности для поля сообщения исчезает вместе с другими ошибками,Поле сообщения должно иметь значение, чтобы ошибки всех полей исчезли.

Как настроить jQuery так, чтобы после добавления значения в поле я нажимал кнопку "Отправить"чтобы проверить, ошибка текстовой опасности для этого конкретного поля больше не отображается?

HTML и jQuery Code

  <div class="container">
    <div class="row">
      <form method="post" action="index.php" class="form-horizontal">
         <div class="form-group">
           <label for="name" class="col-sm-2 control-label">Name</label>
           <div class="col-sm-10">
           <input type="text" id="name" name="name" placeholder="Enter your name" class="form-control" value="<?php echo $name;?>">
           <p class="text-danger">You need to enter a name value</p>
           </div>
         </div>
         <div class="form-group">
           <label for="email" class="col-sm-2 control-label">Email</label>
           <div class="col-sm-10">
           <input type="email" id="email" name="email" placeholder="your@email.com" class="form-control" value="<?php echo $email;?>">
           <p class="text-danger">You need to enter a valid email</p>
           </div>
         </div>
         <div class="form-group">
           <label for="message" class="col-sm-2 control-label">Message</label>
           <div class="col-sm-10">
           <textarea id="message" name="message" rows="4" class="form-control"><?php echo $message;?></textarea>
           <p class="text-danger">You need to enter a message</p>
           </div>
         </div>
         <div class="form-group">
           <label for="secCheck" class="col-sm-2 control-label">
           <?php echo $_SESSION["a"] .'+'.$_SESSION["b"];?>
           </label>
           <div class="col-sm-10">
           <input type="text" id="secCheck" name="secCheck" class="form-control">
           <p class="text-danger">Answer the question above</p>
           </div>
         </div>
         <div class="form-group">
          <div class="col-sm-10 col-sm-offset-2"> 
             <input type="submit" value="Send" class="btn btn-primary btn-large btn-block" id="submit" name="submit">
          </div>
         </div>
         <div class="form-group">
          <div class="col-sm-10 col-sm-offset-2"> 
             <?php echo $result; ?>
          </div>
         </div
      </form>   
    </div>
  </div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>

 $('form').on('submit',function(){
     $(".text-danger").hide();
     var holderValue = false;
     $(this).find('input[type!="hidden"]').each(function(){

        if(!$(this).val()){holderValue=true; $(this).parent().find(".text-danger").show();}
     })
     if(!$("#message").val()){holderValue=true; $(this).parent().find(".text-danger").show();};

     if(holderValue){return false;}
     // event.preventDefault();
     // console.log('form submitted');   
     })


$("input").on("change paste keyup", function() {
  if($(this).val()){
 $(this).parent().find(".text-danger").hide();
} 
});

$("textarea").on("change paste keyup", function() {
  if($(this).val()){
 $(this).parent().find(".text-danger").hide();
} 
});


</script>

1 Ответ

0 голосов
/ 04 марта 2019

Пользовательская форма Bootstrap

Для пользовательской проверки требуется пара ключевых атрибутов и классов Bootstrap:

HTML

  • <form ... novalidate >

  • Все <input ... обязательно >

  • Удалить все <p class='danger-text'>...

  • Заменить предыдущее на <aside class=' Недопустимый отзыв '>

Также теги были изменены с <div> на более семантический тег, но это не обязательно.Макет также был изменен - ​​первоначально макет имел только один .row, который теперь имеет несколько .form-row с (не уверен, было ли это намеренно или нет, но он выглядит лучше при использовании .form-control).


jQuery

  • На каждом .form-control ...
    $('.form-control').each(function() {...

  • ...Если текущий .form-control недействителен ...
    if ($(this).is(':invalid')) {...

  • ... остановить отправку и показать недействительное сообщение ...
    e.preventDefault();
    $(this).next('.invalid-feedback').show();...

  • ... в противном случае скрыть недействительное сообщение, если это необходимо.
    } else {
    $(this).next('.invalid-feedback').hide();
    }


Демо

$('.invalid-feedback').hide();
$('#main').on('submit', function(e) {
  $('.form-control').each(function() {
    if ($(this).is(':invalid')) {
      e.preventDefault();
      $(this).next('.invalid-feedback').show();
    } else {
      $(this).next('.invalid-feedback').hide();
    }
  });
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet">

<main class="container">
  <form id='main' class="form-horizontal" method="post" action="index.php" novalidate>

    <section class="form-row">
      <fieldset class="form-group col-sm-10">
        <label for="name" class="control-label">
          Name
        </label>
        <input id="name" name="name" class="form-control" type="text" placeholder="Enter your name" required>
        <aside class="invalid-feedback">
          You need to enter your name.
        </aside>
      </fieldset>
    </section>

    <section class="form-row">
      <fieldset class="form-group col-sm-10">
        <label for="email" class="control-label">
          Email
        </label>
        <input id="email" name="email" class="form-control" type="email" placeholder="your@email.com" required>
        <aside class="invalid-feedback">
          You need to enter your email.
        </aside>
      </fieldset>
    </section>

    <section class="form-row">
      <fieldset class="form-group col-sm-10">
        <label for="message" class="control-label">
          Message
        </label>
        <textarea id="message" name="message" class="form-control" rows="4" required></textarea>
        <aside class="invalid-feedback">
          You need to enter a message.
        </aside>
      </fieldset>
    </section>

    <section class="form-row">
      <fieldset class="form-group col-sm-10">
        <label for="secCheck" class="control-label">
        </label>
        <input id="secCheck" name="secCheck" class="form-control" type="text" required>
        <aside class="invalid-feedback">
          Answer the security question above.
        </aside>
      </fieldset>
    </section>

    <section class="form-row">
      <fieldset class="form-group col-sm-10 col-sm-offset-2">
        <input id="submit" name="submit" class="btn btn-primary btn-large btn-block" type="submit" value="Send">
      </fieldset>
    </section>

    <section class="form-row">
      <fieldset class="form-group col-sm-10 col-sm-offset-2">
        <output id='result'></output>
      </fieldset>
    </section>

  </form>
</main>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/js/bootstrap.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...