2010-11-22 65 views
6

Web瀏覽器如何處理網頁的JavaScript內容? JavaScript內容是否被解析爲DOM然後呈現?瀏覽器如何處理JavaScript?

我不需要規範,但我需要知道它是如何完成的。請告訴我在網頁上處理JavaScript內容的整個過程。

回答

28

網頁的script部分由瀏覽器的JavaScript解釋器處理,它可能是瀏覽器的固有部分,但通常是獨立的模塊,有時甚至是完全不同的項目(Chrome使用V8; IE使用JScript; Firefox使用SpiderMonkey等)。

當HTML解析器達到script元素,解析器做所有被讀取並存儲通過結束</script>標籤文本(或檢索通過src屬性引用的文件)。然後,除非作者使用了defer or async attributes,否則所有的HTML解析和渲染都會停止,HTML解析器會將腳本文本交給JavaScript解釋器。 JavaScript解釋器在window對象的上下文中解釋JavaScript代碼,並在完成時返回到HTML解析器,該解析器可以繼續解析並顯示頁面。這種停止 - 一切 - 運行 - JavaScript是爲什麼頁面上的一些知名人士recommend putting scripts at the bottom提高了感知加載時間。這也意味着script標記按的順序處理,如果一個腳本依賴另一個腳本,這可能很重要。如果使用deferasync屬性,則腳本執行可以推遲到稍後支持它的瀏覽器。頁面上的所有腳本都在相同的全局執行上下文中執行,共享相同的全局名稱空間和內存區域(因此可以相互交互)。

一旦頁面被解析並呈現,各種事件都可能發生  —用戶可以點擊某個東西,瀏覽器窗口可以調整大小,鼠標可以移動元素。由於處於script標記而運行的JavaScript代碼可以「掛鉤」這些事件,請求瀏覽器在發生事件時調用JavaScript中的函數。這允許JavaScript是交互式的  —例如,用戶單擊頁面上的元素,並且瀏覽器告訴JavaScript解釋器它應該在JavaScript代碼中運行功能X

正如你可以看到上面,存在其中JavaScript代碼可運行兩個稍微不同的情況:在頁面解析/渲染處理(當不使用所述deferasync屬性的script元件被初始處理) ,之後的解析/呈現過程(延遲的腳本,以及響應事件運行的代碼)。在解析/渲染過程中運行的JavaScript可以通過document.write函數直接將內容輸出到HTML解析器。解析/渲染完成後運行的JavaScript當然不能這樣做,但可以使用功能非常強大的DOM HTML API與DOM進行交互。

可能值得注意的是noscript元素:在啓用JavaScript的瀏覽器中,noscript元素被完全跳過。在沒有JavaScript或禁用JavaScript的瀏覽器中,script元素會被完全跳過,而代之以讀取noscript元素。這使得包含僅在呈現頁面時瀏覽器上啓用或不啓用JavaScript的內容變得很容易。

推薦閱讀: