2010-11-03 49 views
2

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

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

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

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

但有更简单的方法,如(伪代码):

form.isSubmitting 

编辑:

竞争状态,因为每说JavaScript的不是。这是由服务器端响应这些操作的顺序而发生的。

为了让您更广泛问题的一个想法:

设置cookie的形式后返回时。 在AJAX调用中(需要每隔X秒发生一次)...服务器端(如果表单发生了)期望cookie被设置。

有时....

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

服务器期望cookie,因为就其而言表单发布已成功。

但是,我需要控制客户端以确保按照规定的方式执行操作。

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

回答

1

在网页上,Javascript中没有“竞争条件”,因为只有一个执行线程。如果您希望在表单提交后(或在任何时候)阻止事件处理程序执行任何操作,最简单的方法是设置一些全局访问标志。处理程序例程必须检查。当然,在适当的时候标记被清除是很重要的。

编辑 —确定你的编辑之后,这是一个更加清楚一点,你在做什么,但有一点是不明确的:被究竟怎么贴在表格?这是一个“自然”的形式吗?如果是这样的话,整个页面将被响应重新加载。或许目标是单独的?

或者说是形式提交的一些其他AJAX代码?

  1. 如果表单提交的“自然”的浏览器,我们正在谈论的是整个页面被重新装入,那么这可能是最简单的情况。表单的“提交”处理程序应该简单地设置全局标志,并且通过间隔计时器运行的代码应该在设置标志时间隔上不做任何事情。无需担心清除标志,因为无论如何页面都会被响应炸毁。

  2. 如果窗体页面上的内发布,或张贴到隐藏,那么它几乎相同的(1),除了响应页面需要明确的全局标志。究竟如何做到这一点取决于何种应用设置涉及,但基本上只会是一些JavaScript在设置top.postingFlagfalse(或其他)的响应。

  3. 如果它是单独发布表单的AJAX代码,那么您在启动XMLHttpRequest时设置标志,并在处理程序中清除它以获得成功/失败。

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

+0

没有的setInterval()允许多个线程同时运行? – Jez 2010-11-03 14:30:44

+0

否 - 每次定时程序被调用时,它就像从一个按钮点击事件循环 - 它永远不会在任何种类的另一事件循环的中间发生 – Pointy 2010-11-03 14:43:53

+0

现代“网络工作者”其实办法有多个线程,但他们从其他代码“防火墙”很好,所以你仍然不能有竞争条件 – Pointy 2010-11-03 14:44:32

0

是的,这是可行的。

您可以通过一个AJAX调用提交表单。通过这种方式,您可以控制ajaxSendajaxComplete事件,并具有用作标志的全局变量var formIsSubmiting = false

就在非表单AJAX调用之前检查变量的状态,并且应该阻止您的竞争条件

1

您可以添加给表单标签:

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

你就可以看它是否通过检查属性“提交”。

相关问题