表单完成提交后执行 javascript

Posted

技术标签:

【中文标题】表单完成提交后执行 javascript【英文标题】:executing javascript after a form finishes submitting 【发布时间】:2012-09-11 01:43:09 【问题描述】:

我正在尝试使用表单将一些文件提交到我的数据库。该表单具有隐藏 iframe 的目标。当它完成加载时,我想显示一条消息。

 $("form#formPost").submit();
 customFunction();

这个例子似乎在触发 customFunction() 之前没有完成提交,这对我的设计非常不利。

有没有办法做一些事情,当它完成发送数据时会触发?我在***上环顾四周,并没有很多关于这个的帖子。我觉得我必须进入目标 iframe 并在它准备好时执行那里的代码等。有没有办法让它按照我的意愿去做?

我尝试过的选项:

 $("form#formPost").submit(function() customFunction(); );

【问题讨论】:

看看这个:***.com/a/12288370/405117 @thecodeparadox 我不认为它会允许将文件和隐藏元素类型发送到服务器。 【参考方案1】:

同事创建了一个函数来做这个。

function SubmitWithCallback(form, frame, successFunction) 
   var callback = function () 
       if(successFunction)
           successFunction();
       frame.unbind('load', callback);
   ;

   frame.bind('load', callback);
   form.submit();

此函数采用您提交的表单、表单目标 iframe 和一个将在成功时执行的匿名函数。

【讨论】:

不使用jQuery的人;使用 #5: frame.onload = null #8: frame.onload = callback; 你好 Fallenreaper,我正在尝试在类似的情况下实现这一点。作为 js 的新手,你能解释一下有人会如何实现它吗?我试图让我的代码等待表单提交,然后将用户重定向到新页面。编辑:这实际上是我为这个问题提出的一个问题:***.com/questions/48269685/… 在我的示例中,表单将更改框架的位置,因此当表单提交时,它将更改框架而不是主机页面。然后你可以看到框架有一个绑定的加载,它将执行你定义的 SuccessFunction。 所以只是为了澄清(抱歉,我仍在学习网络开发的进出),我需要将此功能附加到“保存”按钮并定义一个成功功能(实际上可能是我相信我的 PreSave 功能)。我遵循正确吗?另外,我还需要为其他参数提供什么?也许你可以给我指出一篇关于这些东西的好文章(我以前从未接触过这些东西)。再次感谢您的帮助! 这个函数有3个参数,你提交的表单,页面上的一个框架,你的成功回调。在您的代码中,您将调用此函数。此用例附加到与表单本身无关的任何可点击内容。例如锚标记。在这种情况下,表单和框架是 jQuery 对象。这不是预提交函数,成功函数将是调用成功后发生的情况。【参考方案2】:

如果您以传统方式提交表单,您实际上是在说“我已完成此页面。这里有一堆表单数据供您,Web 服务器,用于呈现我的下一页”。 Web 服务器获取表单数据并将下一页返回给浏览器。

如果您不希望页面重新加载,您可以使用 Ajax 提交您的表单。使用 jQuery 非常简单:

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

使用 Ajax,您可以在提交完成、成功和出错时定义明确的事件。

我不推荐以隐藏 iframe 为目标的方法。 Ajax 更适合这种类型的处理。

更新

这是一个如何构建 Ajax 的示例

<form id='myFormId'>
<!-- Form fields, hidden, file or otherwise -->
</form>

var formVars = $("#myFormId").serialize();
$.ajax( url: ajaxUrl, cache: false, type: 'POST', data: formVars, 
    success: function (data)  handleSuccessCase , 
    error: handleAjaxError );

更新 2

基于https://***.com/a/5513570/141172中的cmets

你可以试试:

var formVars = $('#myFormId').serialize() + '&foo=' + $('#id_of_your_file_input').val()

或者,您可以尝试在 cmets 中建议的插件,这与上面链接的答案中的解决方案相同。

【讨论】:

您是否错过了针对隐藏 iframe 的表单的全部内容? 不,我没有。这是完成 Ajax 更好的工作的一种笨拙方式。 如果我用 ajax 来做,我将如何在表单中完成不同的隐藏或文件类型元素? 我将 ajax 用于大多数其他事情,并且像 ajax 一样,我的目标是在成功时执行该功能。我只是不知道该怎么做。如果你能帮我设置一个将 N 个隐藏元素和 N 个文件元素发送到某个 url 的 ajax 调用,那可能会起作用。 @EricJ。我的意思不是垃圾邮件。如果这是可能的。您能否向我展示一个示例,说明如何将包含 2 个隐藏元素和 2 个文件元素的表单转换为合适的 ajax 请求。在通过 ajax 上传文件时,我一直遇到障碍。【参考方案3】:

也许最简单的做法是在 iframe 上附加一个 onload 事件。当表单完成提交后,该事件将触发。

【讨论】:

在主页面上,我试图做 $("frame#hider").ready(function()...);这并没有真正奏效。 我试过了,但没用。我的意思是,我想我也可以尝试等效的 jquery 来看看它是否有效。 $().onload 但我尝试的是: document.frames["imageCollector"].onload = function () top.document.frames['formDesignContents'].location = "WebFormDesigner.aspx?fm_id=" + top .SELECTED_FM_ID; ; 同事看了看,将你的想法封装在一个函数中。

以上是关于表单完成提交后执行 javascript的主要内容,如果未能解决你的问题,请参考以下文章

在前台怎么通过js实现表单提交后,判断该提交调用的Action方法是不是执行完成了

表单重复提交问题

表单提交后如何捕获 Rails 控制器操作完成

jQuery:提交表单前判断表单是否被修改过

表单提交后 POST 方法返回 404 - Laravel

提交表单后向mysql添加paypal付款确认