2017-03-01 74 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

相關問題