2013-08-16 8 views
8

Jestem nowy w AJAX i użyłem kodu z tej odpowiedzi SO tutaj jQuery Ajax POST example with PHP do integracji z formularzem na stronie WordPress. To działa dobrze, ale mam problemy integracji z walidacji jqueryjQuery sprawdzić z AJAX w submitHandler, przesyła na drugim kliknięciu?

Próbowałem umieszczenie JavaScript na stronie powyżej do funkcji submitHandler poniżej

$("#my-form").validate({ 
    submitHandler: function(form) { 
    **js from other page** 
    } 
}); 

moja forma sprawdza się na pierwszym kliknięciem. Następnie, jeśli wpisuję dane wejściowe i nic się nie dzieje, muszę kliknąć drugi raz, aby formularz został poprawnie przesłany za pomocą AJAX. Poniżej znajduje się jsfiddle. Jakakolwiek pomoc się przyda, dzięki.

jsfiddle mojego kodu pomyślałem będzie to błąd logowania do konsoli od form.php nie jest związana

+0

Co to jest "** js z innej strony **"? Proszę pokazać wystarczającą ilość kodu, aby dokonać zwięzłej prezentacji problemu. Twój OP nie powinien polegać na zewnętrznych linkach, aby pokazać cały odpowiedni kod. Wtyczka jQuery Validate wymaga tylko _jednego kliknięcia, chyba że omyłkowo zapakowałeś '.validate()' wewnątrz handlarza 'click' lub' submit'. W twoim przypadku omyłkowo zapakowano procedurę obsługi "submit" wewnątrz domyślnego "submitHandler" wtyczki. Ponieważ wywołanie zwrotne 'submitHandler' wtyczki przechwytuje już zdarzenie submit, twoja załączona procedura' submit' jest zbędna. – Sparky

Odpowiedz

11

Zadaniem submitHandler jest przesłać formularz, aby nie rejestrować formą przedstawienia obsługi zdarzeń.

Funkcja submitHandler jest wywoływana, gdy zostanie wywołane zdarzenie formm submit, w twojej sprawie zamiast przesłać formularz, w którym rejestrowałeś procedurę przesyłania, więc gdy po raz pierwszy formularz zostanie wysłany, formularz nie zostanie przesłany. kiedy jest on uruchamiany po raz drugi, najpierw przesyłane jest zgłoszenie przez walidatora, a następnie uruchamiany program obsługi, który uruchamia żądanie ajax.

W submitHandler po prostu trzeba wysłał żądania ajax nie ma potrzeby, aby zarejestrować obsługi zdarzeń

$("#add-form").validate({ 
    submitHandler: function (form) { 
     // setup some local variables 
     var $form = $(form); 
     // let's select and cache all the fields 
     var $inputs = $form.find("input, select, button, textarea"); 
     // serialize the data in the form 
     var serializedData = $form.serialize(); 

     // let's disable the inputs for the duration of the ajax request 
     $inputs.prop("disabled", true); 

     // fire off the request to /form.php 

     request = $.ajax({ 
      url: "forms.php", 
      type: "post", 
      data: serializedData 
     }); 

     // callback handler that will be called on success 
     request.done(function (response, textStatus, jqXHR) { 
      // log a message to the console 
      console.log("Hooray, it worked!"); 
      alert("success awesome"); 
      $('#add--response').html('<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">×</button><strong>Well done!</strong> You successfully read this important alert message.</div>'); 
     }); 

     // callback handler that will be called on failure 
     request.fail(function (jqXHR, textStatus, errorThrown) { 
      // log the error to the console 
      console.error(
       "The following error occured: " + textStatus, errorThrown); 
     }); 

     // callback handler that will be called regardless 
     // if the request failed or succeeded 
     request.always(function() { 
      // reenable the inputs 
      $inputs.prop("disabled", false); 
     }); 

    } 
}); 
+0

Arun Właśnie sprawdziłem ten kod i moja wartość wejściowa nie jest wysyłana do pliku form.php. Powrót do starego kodu z działaniem sprawdzania poprawności. Kilka zmian w twoim kodzie nie ma var żądania i funkcji (formy) zamiast wydarzenia. Czy któraś z tych zmian może spowodować, że moje dane wejściowe nie zostaną wysłane? Dzięki – Anagio

+1

To zakończyło działanie 'submitHandler: function (form) {var $ form = $ (formularz); w przeciwnym razie otrzymam formularz nie jest zdefiniowany błąd – Anagio

+0

Jaki powinien być adres URL parametru url (tutaj jest url: formularze .php) jeśli mój kod js jest w js/custom.lokalizacja js? – noobcode

3

Wywołanie $("#add-form").submit(function(){...}) nie wysłać formularz. Łączy program obsługi, który mówi, co zrobić, gdy użytkownik przesyła formularz. Dlatego musisz przesłać dwa razy: po raz pierwszy wywołuje procedurę obsługi przesyłania poprawek wtyczki, która sprawdza poprawność danych i uruchamia twoją funkcję, a po raz drugi wywołuje procedurę obsługi przesyłania, którą dodałeś za pierwszym razem.

Nie koduj wewnątrz kodu .submit(), zrób to bezpośrednio w swojej funkcji submitHandler:. Zmiana:

var $form = $(this); 

do:

var $form = $(form); 

Nie trzeba event.PreventDefault(), wtyczka validate robi to za Ciebie.

2
$("#add-form").validate({ 
    submitHandler: function (form) { 
     var request; 
     // bind to the submit event of our form 



     // let's select and cache all the fields 
     var $inputs = $(form).find("input, select, button, textarea"); 
     // serialize the data in the form 
     var serializedData = $(form).serialize(); 

     // let's disable the inputs for the duration of the ajax request 
     $inputs.prop("disabled", true); 

     // fire off the request to /form.php 

     request = $.ajax({ 
       url: "forms.php", 
       type: "post", 
       data: serializedData 
     }); 

     // callback handler that will be called on success 
     request.done(function (response, textStatus, jqXHR) { 
       // log a message to the console 
       console.log("Hooray, it worked!"); 
       alert("success awesome"); 
       $('#add--response').html('<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">×</button><strong>Well done!</strong> You successfully read this important alert message.</div>'); 
     }); 

     // callback handler that will be called on failure 
     request.fail(function (jqXHR, textStatus, errorThrown) { 
       // log the error to the console 
       console.error(
        "The following error occured: " + textStatus, errorThrown); 
     }); 

      // callback handler that will be called regardless 
      // if the request failed or succeeded 
     request.always(function() { 
       // reenable the inputs 
       $inputs.prop("disabled", false); 
     });    

    } 
}); 
Powiązane problemy