2011-03-24 103 views
18

我一直在做一些使用GWT的Web應用程序編程,並被術語「瀏覽器事件循環」所困惑。什麼是瀏覽器事件循環?

我遇到了需要在瀏覽器事件循環完成後執行延遲命令和「執行某些操作」的情況。

我想知道它到底是什麼,以及在事件循環過程中以及按什麼順序發生了什麼?

+2

類似的:http://stackoverflow.com/questions/5131086/using-the-gwt-scheduler – 2011-03-24 21:42:49

回答

18

瀏覽器事件循環是瀏覽器啓動的一個線程,它不斷掃描並運行不同的事件,就像聽起來一樣。當事件發生時,它們被放入事件隊列並由一個事件線程輪流運行。你的javascript不應該創建自己的循環來等待它完成或者類似的東西......它會阻塞這個連續的事件循環線程。相反,您可以使用setTimeout或setInterval之類的東西,並檢查您正在等待的任何條件,以便瀏覽器在「等待」時可以進行工作。

GWT很好,因爲它可以通過使用scheduler來共同選擇這個過程 - 在您希望在事件循環「完成」之後運行某些事情的情況下,您可能需要使用scheduleFinally或scheduleDeferred。它會將一段代碼的處理程序注入到事件隊列中,以便它將在當前執行上下文中的所有其他代碼之後運行(當前執行上下文==,其中您當前處於當前JavaScript對象層次結構中的窗口作爲根對象)在下一個放入隊列中的事件之前運行。

+1

另外,是我們的小部件和UI元素附加到DOM循環中的最後一個事件,之後的瀏覽器事件循環完成? – gofeddy 2011-03-25 13:06:32

+1

DOM操作事件的處理方式與其他事件完全相同。他們不一定是第一個也可以是最後一個要開火的事件,無論他們在哪裏碰到隊列。他們還會冒泡DOM樹,因此您可以在觸發事件觸發處的樹上的任意位置爲這些事件設置偵聽器。在vanilla js中,複雜的因素是每個瀏覽器都以不同的方式處理DOM突變事件。 – Ichorus 2011-03-25 14:13:04

+0

GWT通過GWTEventSystem'捕捉'事件來嘗試創建統一的事件處理方案。事件遵循上面概述的樹冒泡方案,但是對於觸發的每個事件,它首先通過GWT HandlerManager,該GWT HandlerManager查找爲該類型事件註冊的處理程序。如果它找到一個,它會觸發EventHandler代碼,如果它不傳遞給瀏覽器以進行標準處理。你到底想做什麼? – Ichorus 2011-03-25 14:34:28