Как сделать обратный вызов Jquery после отправки формы?

У меня есть простая форма с удаленным = true.

Эта форма фактически находится в HTML-диалоге, который закрывается, как только нажимается кнопка "Отправить".

Теперь мне нужно внести некоторые изменения на главной HTML-странице после успешной отправки формы.

Я попробовал это с помощью jQuery. Но это не гарантирует, что задачи будут выполнены после некоторой формы ответа на отправку формы.

$("#myform").submit(function(event) {

// do the task here ..

});

Как прикрепить обратный вызов, чтобы мой код выполнялся только после успешной отправки формы? Есть ли способ добавить какой-либо обратный вызов .success или .complete в форму?

Ответ 1

Я только что сделал это -

 $("#myform").bind('ajax:complete', function() {

         // tasks to do 


   });

И все сработало отлично.

Подробнее см. эту документацию api.

Ответ 2

Я не мог получить решение номер один, чтобы работать надежно, но нашел, что это работает. Не уверен, требуется ли это или нет, но у меня нет атрибута action или method в теге, который гарантирует, что POST обрабатывается функцией $.ajax и предоставляет вам функцию обратного вызова.

<form id="form">
...
<button type="submit"></button>
</form>

<script>
$(document).ready(function() {
  $("#form_selector").submit(function() {

    $.ajax({
     type: "POST",
      url: "form_handler.php",
      data: $(this).serialize(),
      success: function() {
        // callback code here
       }
    })

  })
})
</script>

Ответ 3

Вам придется делать все вручную с помощью вызова AJAX на сервер. Это потребует от вас также переопределить форму.

Но не беспокойтесь, это кусок пирога. Вот обзор того, как вы будете работать с вашей формой:

  • переопределить действие отправки по умолчанию (благодаря переданному в объекте события методу preventDefault)
  • захватить все необходимые значения из формы
  • отключить HTTP-запрос
  • обрабатывать ответ на запрос

Сначала вам нужно отменить действие отправки формы следующим образом:

$("#myform").submit(function(event) {
    // Cancels the form submit action.
    event.preventDefault();
});

И затем, возьмите значение данных. Предположим, что у вас есть одно текстовое поле.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();
});

И затем отпустите запрос. Предположим, что это запрос POST.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();

    // I like to use defers :)
    deferred = $.post("http://somewhere.com", { val: val });

    deferred.success(function () {
        // Do your stuff.
    });

    deferred.error(function () {
        // Handle any errors here.
    });
});

И это должно сделать это.

Примечание 2: Для анализа данных формы предпочтительнее использовать плагин. Это сделает вашу жизнь очень легкой, а также предоставит приятную семантику, которая имитирует действительную действительность формы.

Примечание 2: Вам не нужно использовать перебежчики. Это просто личное предпочтение. Вы также можете сделать следующее, и оно тоже должно работать.

$.post("http://somewhere.com", { val: val }, function () {
    // Start partying here.
}, function () {
    // Handle the bad news here.
});

Ответ 4

Для MVC здесь был еще более простой подход. Вам нужно использовать форму Ajax и установить AjaxOptions

@using (Ajax.BeginForm("UploadTrainingMedia", "CreateTest", new AjaxOptions() { HttpMethod = "POST", OnComplete = "displayUploadMediaMsg" }, new { enctype = "multipart/form-data", id = "frmUploadTrainingMedia" }))
{ 
  ... html for form
}

вот код отправки, это находится в разделе готового документа и связывает событие onclick кнопки, чтобы отправить форму

$("#btnSubmitFileUpload").click(function(e){
        e.preventDefault();
        $("#frmUploadTrainingMedia").submit();
});

здесь обратный вызов, указанный в AjaxOptions

function displayUploadMediaMsg(d){
    var rslt = $.parseJSON(d.responseText);
    if (rslt.statusCode == 200){
        $().toastmessage("showSuccessToast", rslt.status);
    }
    else{
        $().toastmessage("showErrorToast", rslt.status);
    }
}

в методе контроллера для MVC это выглядит как

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult UploadTrainingMedia(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null)
    {
        foreach (var file in files)
        {
            // there is only one file  ... do something with it
        }
        return Json(new
        {
            statusCode = 200,
            status = "File uploaded",
            file = "",
        }, "text/html");
    }
    else
    {
        return Json(new
        {
            statusCode = 400,
            status = "Unable to upload file",
            file = "",
        }, "text/html");
    }
}

Ответ 5

Я не верю, что есть функция обратного вызова, подобная той, которую вы описываете.

Что здесь нормально, так это делать изменения, используя какой-то серверный язык, например PHP.

В PHP вы можете, например, извлечь скрытое поле из своей формы и внести некоторые изменения, если он присутствует.

PHP:

  $someHiddenVar = $_POST["hidden_field"];
    if (!empty($someHiddenVar)) {
        // do something 
    }

Один из способов сделать это в JQuery - использовать Ajax. Вы можете слушать submit, возвращать false, чтобы отменить свое поведение по умолчанию и вместо этого использовать jQuery.post(). jQuery.post имеет успешный обратный вызов.

$.post("test.php", $("#testform").serialize(), function(data) {
  $('.result').html(data);
});

http://api.jquery.com/jQuery.post/

Ответ 6

Обработчики формы "при отправке" вызываются до отправки формы. Я не знаю, есть ли обработчик для вызова после отправки формы. В традиционном не Javascript смысле отправка формы перезагрузит страницу.

Ответ 7

$("#formid").ajaxForm({ success: function(){ //to do after submit } });