由于 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>