有没有办法知道HTML表单当前是否正在提交?

时间:2010-11-03 14:20:23

标签: javascript html ajax form-submit

我有一个竞争条件,如果页面上的表单当前正在提交,我不希望发生AJAX调用。

我宁愿不改变表单的代码。

我正在考虑将事件处理程序附加到每个表单元素,以便onsubmit它会递增一个计数器然后onreadystatechange递减计数器。

然后在AJAX调用之前,检查以确保计数器在触发前为零。

然而,有一种更简单的方法,如(伪代码):

form.isSubmitting 

编辑:

竞争条件不是因为JavaScript per-say。它是由服务器端响应这些操作的顺序而发生的。

让您了解更广泛的问题:

表单帖子返回时设置cookie。 在AJAX调用上(需要每隔X秒发生一次)......服务器端(如果发布了表单帖子)需要设置cookie。

有时......

如果表单提交返回有延迟(并设置cookie客户端),则会触发AJAX调用而不发送cookie。

服务器需要cookie,因为就其而言,表单帖子已经成功。

然而,我需要控制客户端,以确保以规定的方式执行操作。

因此,正确的JavaScript本身不会导致竞争条件,但是(据我的测试显示) - POST / AJAX调用的提交和返回会导致我的特定情况下的竞争条件。

3 个答案:

答案 0 :(得分:1)

网页上的Javascript中没有“竞争条件”,因为只有一个执行线程。如果你想阻止事件处理程序在提交表单之后(或者在任何时候,真的)做任何事情,最简单的事情就是设置一些全局可访问的标志。处理程序例程只需要检查它。当然,在适当的时候清除标志是很重要的。

编辑 - 编辑后确定,你做得更清楚一点,但有一点不清楚:表格究竟是如何发布的?这是一个“自然”形式的帖子吗?如果是这种情况,整个页面将由响应重新加载。目标是一个单独的<iframe>吗?

或者是某些其他 AJAX代码提交的表单?

  1. 如果表单是由浏览器“自然地”提交的,而我们正在讨论整个页面正在重新加载,那么这可能是最简单的情况。表单的“提交”处理程序应该只设置全局标志,并且通过间隔计时器运行的代码应该在设置标志时间隔内不执行任何操作。没有必要担心清除标志,因为无论如何页面都会受到响应的轰炸。

  2. 如果表单在页面上的<iframe>内发布,或者发布到隐藏的<iframe>,那么除了响应页面之外,它几乎与(1)相同将需要清除全局标志。究竟如何做到这一点取决于应用程序设置涉及的内容,但基本上它只是在响应中将top.postingFlag设置为false(或其他)。

  3. 如果是发布表单的单独AJAX代码,则在启动XMLHttpRequest时设置标志,并在处理程序中将其清除成功/失败。

  4. 在所有情况下,关键是间隔计时器中的代码用于监视标志的状态,并避免在设置标志时发布。

答案 1 :(得分:1)

您可以将其添加到表单标记:

<form ... onsubmit="this.setAttribute('isSubmitting', 'true');">

你将能够通过检查该属性来查看它是否“提交”。

答案 2 :(得分:0)

是的,那会有效。

您可以通过AJAX通话提交表单。这样,您就可以控制ajaxSendajaxComplete事件,并将全局变量称为var formIsSubmiting = false作为标记。

在非形式AJAX调用之前检查变量的状态,这应该会阻止竞争条件