2017-03-01 76 views
0
  • 由于JavaScript是同步运行(不setTimeout)添加或删除HTML元素,都应该是向用户显示HTML更改之前它是彻底完蛋了?当JavaScript仍在运行时,浏览器是否显示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'; 
} 

(似乎有很多关于回流损害性能的讨论。但我还是不知道是否存在任何规定或也许它只是取决于浏览器,尤其是有关提交表单,不管它是否有任何与回流或渲染。)

+0

愿你添加一个明确的问题陈述你的问题?目前这里有几个问题,这些问题似乎相当公开,并且可能会吸引有见地的答案。 – evolutionxbox

+0

请注意,表单提交与settimeout同步。你的意思是阻止代码像一个永无止境的循环或实际上等待服务器的响应? – slebetman

+0

@slebetman不,只是非常简单的JavaScript添加元素,例如将2个'textarea'元素添加到表单中。点击提交按钮可以提交一个'textarea'吗? – cshu

回答

1

我觉得你的困惑可以通过你如何命名你的榜样作用happens_to_be_running_and_user_clicks_submit来解释。我认为你期望用户点击按钮时可以运行一个函数。

这是不可能的。至少不是没有使用网络工作者。即使如此,当Web工作人员将消息发回主线程以改变DOM时,Web工作人员无法改变DOM,因此再次变得不可能。

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

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

  1. 您的功能在用户点击按钮之前立即执行。然后,当用户单击按钮时,该功能所做的所有操作都将呈现并激活。

  2. 你莫名其妙的功能执行用户点击该按钮后即可。然后,当用户单击按钮时,该功能无效。

没有第三种状态。它可以是全部或全部。至少不是没有异步的东西,如setTimeout或ajax。

+0

应该指出,虽然大多数人的动画像淡入或淡出的心理模型是一个功能,但它的工作动画实际上是一系列由setTimeout或setInterval或requestAnimationFrame定期调用的函数。所以动画属于异步类 – slebetman

相关问题