Отключить процесс регистрации в многоступенчатой форме, если принимается электронное письмо, с помощью ajax-запросов

#jquery #ajax

#jquery #ajax

Вопрос:

У меня есть многоступенчатая форма, первым шагом которой является запрос адреса электронной почты / логина. На keyup нем проверяется, принято ли электронное письмо, используя ajax запрос. Если оно принято, email для поля устанавливается значение "" (т.е. Значение отсутствует).

Проблема в том, допустим, я пытаюсь получить электронное письмо xyz@gmail.com . Во время набора текста я буду держать один палец на m кнопке (в .com), а другой палец на кнопке мыши и нажимать на мышь, как только я наберу последний m . Я по-прежнему получаю доступ к шагу 2, даже если используется идентификатор электронной почты и отображается сообщение об ошибке для того же самого.

Вот коды:

Лезвие

  <form id="new_user1" autocomplete="off">
 @csrf
 <input type="hidden" name="_token" id="_csrf" value="{{Session::token()}}">

<div id="emailpage" class="animate__animated animate__bounce frm">

   <div class="form-group mb-2" id="form1">
<img src= "" alt="Login" style=" width: 70px; height: 70px;" class="text-center"><br>
 <p class="text-muted mb-4">Let's start with your Login/UserName Info</p>
 <div id="emailtaken" class="text-danger"></div>
 <input id="email" name="email" type="text" placeholder="Email address" class="form-control rounded-pill border-0 shadow-sm px-4">
 <div class="error text-danger"></div> 
    </div>
 <button type="button" class="btn btn-primary btn-block text-uppercase mb-4 mt-2 rounded-pill shadow-sm step1" id="start">Get started <i class="fas fa-arrow-alt-circle-right"></i></button>   
   </div>


//Step 2 asks for Password and so on (after validating Step 1)
 

Сценарий

 $('#step2pages').hide();
   
     jQuery.validator.addMethod("nowhitespace", function(value, element) {
        return this.optional(element) || /^S $/i.test(value);
        }, "No white space please");

        $.ajaxSetup({
               headers: {
               'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                  }
              });

     var x= $('#new_user1').validate({
      focusCleanup:true,
      rules: {
                
              //other rules

                email: {
                    required: true,
                    email: true,
                    nowhitespace :true
                    
                    // remote:{
                    //    url:'check-email',
                    //    type:'get'
                    //        }
                       
                },
                password:{
                  required:true,
                  nowhitespace:true,
                  minlength:8
                },
                cpassword:{
                  required:true,
                  nowhitespace:true,
                  equalTo:"#password"
                },

               //other rules for furthur steps
            },

            messages: {
              email: {
                    required: "Email address cannot be blank",
                    email: "Email format should be example@examle.com or similar",
               },
          //Other messages 
         },
            errorPlacement: function (error, element) {
                element.each(function () {
                    $(this).next("div .error").html(error);
                });
            },
        });
     $('.step1').click(function(){
      if(x.form()){
         $('.frm').hide();
       $("#passworddetailspage").show();
    }
    });
     $('.step2').click(function(){
      if(x.form()){
       $('.frm').hide();
       $('#otherdetailspage').show();
      }
     });
     $('.back2').click(function(){
       $(".frm").hide();
       $("#emailpage").show();
       });
    
 //other codes

 $('#email').keyup(function(){
        $.ajax({
         url:'check-email',
         type:'get',
         data:{
             'email':$('#email').val(),
            },
            dataType:'JSON',
            success: function e(response){
                 if(response.success==false){
                    var em= $('#email').val();
                    em = " is taken. Please try a different one";
              $('#emailtaken').html(em);
              $('#email').val("");
         }
    },
            error: function e1(response){
                console.log('error=>' ,response);

            }
          });


     });
 

Контроллер

 //Code to search the database
      if ($user)
        return response()->json(['false']);
       } else{
             return response()->json(['true']);
         }

       }

 

Кроме того, использование remote: в jQuery validator rules: и возврат json_encode(false) дают непредсказуемое поведение, например — иногда он принимает второй адрес электронной почты, даже если он принят, иногда другие средства проверки электронной почты не отображаются и т.д. Как я могу отключить дальнейшие шаги при получении электронного письма?

Ответ №1:

Рассмотрите возможность использования .click() метода, а не keyup метода следующим образом :-

 $('.step1').click(function(){
        $.ajax({
         url:'check-email',
         type:'get',
         data:{
             'email':$('#email').val(),
            },
            dataType:'JSON',
            success: function e(response){
                 if(response.success==false){
                    
                    var em= $('#email').val();
                    em = " is taken. Please try a different one";
                    em = " or <a href='login'>Login Now</a>  ";
                     $(".frm").hide();
               $('#emailpage').show();
                $('#alerts').show();
              $('#emailtaken').html(em);
              $('#email').val(""); // This is important
             }else{
                if(x.form()){
                $('#alerts').hide();
                $('.frm').hide();
                $("#otherformparts").show();
                 }
             }

            },
            error:function e1(response){
                console.log('error=>' ,response);

            }
          });


     });
 

Кроме того, измените свой код соответствующим образом, как будто вам не нужны две $('.step1').click() функции