表单提交后如何进行Jquery回调?

gee*_*ter 115 html javascript asp.net jquery webforms

我有一个带有remote = true的简单表单.

此表单实际上位于HTML对话框上,一旦单击"提交"按钮,该对话框就会关闭.

现在,我需要在表单成功提交后对主HTML页面进行一些更改.

我尝试使用jQuery.但这并不能确保在表单提交的某种形式的响应之后执行任务.

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

// do the task here ..

});
Run Code Online (Sandbox Code Playgroud)

如何附加回调,以便我的代码只有在成功提交表单后才能执行?有没有办法在表单中添加一些.success或.complete回调?

gee*_*ter 114

我这样做了 -

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

         // tasks to do 


   });
Run Code Online (Sandbox Code Playgroud)

事情很完美.

有关更多具体细节,请参阅此api文档.

  • "从jQuery 1.8开始,.ajaxComplete()方法应该只附加到文档" (17认同)
  • 注意:这将在**任何**ajax事件完成后启动你的功能,而不仅仅是你的表单提交(除非我弄错了,在这种情况下,我很乐意为你提供你找到的地方的链接这个) (9认同)
  • 如果通常提交`<form>`?(我的意思不是Ajax)我可以在`.bind()`的第一个参数中添加什么?编辑:好吧,我猜`click`.女,对不起.:p (7认同)
  • 没有工作形式,使用普通表单,按钮,但按钮调用javascript $('#formFile').submit(); (6认同)
  • 哇...我刚刚学到了新东西.是的,从它的外观来看,这是最简单的解决方案.也许,它甚至是最好的.我是狂热的Coding Horror读者,在那篇博客中,Jeff Attwood强调我们应该编写更少的代码,这种方法可以实现这一目标.很好找.:) (3认同)

Bra*_*ard 32

我无法获得第一个可靠的工作解决方案,但发现这是有效的.不确定是否需要,但我没有标记上的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>
Run Code Online (Sandbox Code Playgroud)

  • 没有分号的javascript ...有些人只想看世界燃烧.你的解决方案虽然有效,所以谢谢:) (14认同)
  • 请注意,`.serialize`不包括POSTed请求中的文件输入.使用HTML5 FormData(请参阅[此问题](http://stackoverflow.com/q/10899384/957950)),除非您支持IE <9之类的旧浏览器 (2认同)

Sal*_*Sal 23

您必须通过对服务器的AJAX调用手动执行操作.这将要求您也覆盖表单.

但别担心,这是小菜一碟.以下是您将如何处理表单的概述:

  • 覆盖默认的提交操作(感谢传入的事件对象,它有一个preventDefault方法)
  • 从表单中获取所有必要的值
  • 触发HTTP请求
  • 处理对请求的响应

首先,您必须取消表单提交操作,如下所示:

$("#myform").submit(function(event) {
    // Cancels the form's submit action.
    event.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

然后,抓住数据的价值.我们假设你有一个文本框.

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

然后发出请求.我们假设它是一个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.
    });
});
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.

注2:为了解析表单的数据,最好使用插件.它将使您的生活变得非常简单,并提供一个模仿实际表单提交操作的漂亮语义.

注2:您不必使用延期.这只是个人偏好.您可以同样执行以下操作,它也应该可以工作.

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

  • 很棒的样品。如何对文件上传(多部分/表单数据)做同样的事情??? (2认同)

ede*_*son 10

对于MVC来说,这是一种更简单的方法.您需要使用Ajax表单并设置AjaxOptions

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

这是提交代码,这是在文档就绪部分,并将按钮的onclick事件绑定到提交表单

$("#btnSubmitFileUpload").click(function(e){
        e.preventDefault();
        $("#frmUploadTrainingMedia").submit();
});
Run Code Online (Sandbox Code Playgroud)

这是AjaxOptions中引用的回调

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

在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这真的不是投票的好理由.答案有效,可能会帮助面临同样问题的.NET开发人员. (13认同)
  • 那些代码是.Net代码,而问题从未指定过. (2认同)

Sin*_*dre 7

我不相信有一个像你描述的那样的回调函数.

这里正常的是使用一些服务器端语言(如PHP)进行更改.

在PHP中,您可以从表单中获取隐藏字段,并在存在时进行一些更改.

PHP:

  $someHiddenVar = $_POST["hidden_field"];
    if (!empty($someHiddenVar)) {
        // do something 
    }
Run Code Online (Sandbox Code Playgroud)

在Jquery中实现它的一种方法是使用Ajax.您可以侦听提交,返回false以取消其默认行为并使用jQuery.post()代替.jQuery.post有一个成功回调.

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

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