如何使表单提交同步?

问题描述 投票:5回答:1

由于javascript(包括表单提交)是同步的,并且单线程模型除了ajax调用。是对的吗?但我面临一个问题。

我在第1行提交表单,然后关闭弹出窗口。会发生什么是在表单提交之前调用self.close。所以这里它以异步模式运行。表单提交是异步过程吗?如果是,我如何在表单提交同步后生成代码?(我不想使用setTimeOut和ajax)

这是我的相关jsp代码

function clickSave()
 {

    document.form.action="customerAction.do";
    document.form.submit();// line 1
    self.close();// line 2

 }

更新: - 看起来我需要更正自己表单提交是异步过程根据Is form submit synchronous or async?。所以问题是如何使self.close与表单提交同步

javascript synchronization
1个回答
6
投票

由于javascript(包括表单提交)是同步的,并且单线程模型除了ajax调用。是对的吗?但我面临一个问题。

好吧,JS对于每个事件监听器都是异步的。 Ajax允许异步模式,将结果作为事件返回。

JS主要不是并发的:一次只执行一个函数。但是,在最新版本中,有一些方法可以在JS中创建后台“并发”线程(1)

JS在单个线程上运行。 (背景线程除外)

我在第1行提交表单,然后关闭弹出窗口。会发生什么是在表单提交之前调用self.close。

这是不可能的。

表单提交是异步过程吗?

提交是异步的,也就是说,JS将继续运行和结束。

你可以测试这个例子(2)。

如果是,我如何在表单提交同步后生成代码?(我不想使用setTimeOut和ajax)

提交将重新加载整个页面,因此您的JS将结束,之后,窗口将从服务器加载具有表单结果的新页面。您可以在此新页面中包含一个新的JS以“继续”。

如果您不想重新加载所有页面,则必须使用AJAX,在这种情况下,您有2个选项:

  • 异步:您可以设置一个事件监听器来接收和使用结果。
  • 同步:您的页面将阻塞,直到结果准备就绪。

注意:(1):https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers?redirectlocale=en-US&redirectslug=DOM%2FUsing_web_workers

(2):

<html>
    <body>
        <script type="text/javascript">
        function click2()
        {
            document.getElementById('form1').submit();
            for(var i=0; i < 1000000000; i++);
            window.open('http://www.stackoverflow.com');
        }
        </script>

        <button onclick="click2();"> click </button>
        <br/><br/>
        <form id="form1" action="http://www.duckduckgo.com" method="get">
            <input type="text" value="hello"/>
        </form>
    </body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.