gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:28:18 28 4
gpt4 key购买 nike

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

我不想更改表单的代码。

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

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

但是有没有更简单的方法比如(伪代码):

form.isSubmitting 

编辑:

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

为了让您了解更广泛的问题:

当表单发布返回时设置一个 cookie。在 AJAX 调用中(需要每 X 秒发生一次)...服务器端(如果表单发布已经发生)期望设置 cookie。

有时候……

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

服务器需要 cookie,因为就它而言,表单发布已成功。

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

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

最佳答案

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

编辑 — 好的,在您编辑之后,您正在做的事情会更清楚一些,但有一件事尚不清楚:表单究竟是如何发布的?它是“自然”形式的帖子吗?如果是这种情况,响应将重新加载整个页面。目标是单独的 <iframe>也许?

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

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

  2. 如果表单在 <iframe> 内发布在页面上,或发布到隐藏的 <iframe> , 那么除了响应页面需要清除global flag外,和(1)几乎一样。具体怎么做取决于应用程序设置涉及的内容,但基本上它只是响应中设置 top.postingFlag 的一些 Javascript。至 false (或其他)。

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

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

关于javascript - 有没有办法知道当前是否正在提交 HTML 表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087983/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com