【问题标题】:Does browser show HTML changes or allow submitting form while JavaScript is still running?浏览器是否显示 HTML 更改或允许在 JavaScript 仍在运行时提交表单?
【发布时间】:2017-07-20 13:42:57
【问题描述】:
  • 鉴于 JavaScript 正在同步运行(无 setTimeout)以添加或删除 HTML 元素,是否应该在完全完成之前向用户显示 HTML 更改?

  • 更重要的是,如果 JavaScript 正在更改可以包含在表单提交中的元素(例如添加多个 textarea 元素),用户可以在进行中单击提交按钮并提交不完整的请求吗? (一些textarea元素包含在请求中,一些textarea元素没有。)


类似这样的: <form action="" method="post"><input type="submit" value="Submit"></form>

当用户提交它时,某些功能恰好在进行中。

function happens_to_be_running_and_user_clicks_submit(){
    the_form_element.insertBefore(document.createElement('textarea'),the_form_element.firstChild).value='first textarea value';
    the_form_element.insertBefore(document.createElement('textarea'),the_form_element.firstChild).value='second textarea value';
}

(似乎有很多关于回流会损害性能的讨论。但我仍然不确定是否存在任何要求,或者它可能只是取决于浏览器。尤其是关于提交表单,无论它是否有任何需要做回流或渲染。)

【问题讨论】:

  • 您能否在您的问题中添加一个清晰的问题陈述?目前这里有几个问题,似乎相当开放,并且可能会吸引固执己见的答案。
  • 请注意,表单提交与 settimeout 一样是同步的。您的意思是像一个永无止境的 while 循环那样阻塞代码还是实际上在等待来自服务器的响应?
  • @slebetman 不,只是非常简单的 javascript 添加元素,例如将 2 个 textarea 元素添加到表单中。点击提交按钮可以只提交其中一个textarea吗?

标签: javascript html browser rendering reflow


【解决方案1】:

我认为您的困惑可以通过您将示例函数命名为 happens_to_be_running_and_user_clicks_submit 来解释。我假设您希望当用户单击按钮时函数可能正在运行。

这是不可能的。至少在不使用网络工作者的情况下是这样。即便如此,Web Worker 也无法更改 DOM,因此当 Web Worker 将消息发送回主线程以更改 DOM 时,它再次变得不可能了。

Javascript 是单线程的。因此,一次只能发生一件事。当用户执行任何操作(移动窗口、单击按钮、移动鼠标​​......)时,操作系统会将该事件发送到应用程序的事件队列。 Javascript(或者更确切地说,浏览器)读取这个队列来处理事件。但由于它是单线程的,它只在不忙时处理事件。

所以。这给我们留下了两种可能性。

  1. 您的函数会在用户单击按钮之前立即执行。然后,当用户单击按钮时,该函数所做的一切都会被渲染并激活。

  2. 您的函数以某种方式在用户单击按钮后立即执行。那么当用户单击按钮时,该函数所做的任何事情都不会被激活。

没有第三种状态。要么全有,要么全无。至少不是没有像 setTimeout 或 ajax 这样的异步的东西。

【讨论】:

  • 应该注意的是,虽然大多数人对动画(如淡入或淡出)的心理模型是一个单独的函数,但实际上动画是由 setTimeout 或 setInterval 定期调用的一系列函数或 requestAnimationFrame。所以动画属于异步的范畴
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2017-08-12
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2023-03-13
相关资源
最近更新 更多