Web瀏覽器如何處理網頁的JavaScript內容? JavaScript內容是否被解析爲DOM然後呈現?瀏覽器如何處理JavaScript?
我不需要規範,但我需要知道它是如何完成的。請告訴我在網頁上處理JavaScript內容的整個過程。
Web瀏覽器如何處理網頁的JavaScript內容? JavaScript內容是否被解析爲DOM然後呈現?瀏覽器如何處理JavaScript?
我不需要規範,但我需要知道它是如何完成的。請告訴我在網頁上處理JavaScript內容的整個過程。
網頁的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
標記按的順序處理,如果一個腳本依賴另一個腳本,這可能很重要。如果使用defer
或async
屬性,則腳本執行可以推遲到稍後支持它的瀏覽器。頁面上的所有腳本都在相同的全局執行上下文中執行,共享相同的全局名稱空間和內存區域(因此可以相互交互)。
一旦頁面被解析並呈現,各種事件都可能發生 —用戶可以點擊某個東西,瀏覽器窗口可以調整大小,鼠標可以移動元素。由於處於script
標記而運行的JavaScript代碼可以「掛鉤」這些事件,請求瀏覽器在發生事件時調用JavaScript中的函數。這允許JavaScript是交互式的 —例如,用戶單擊頁面上的元素,並且瀏覽器告訴JavaScript解釋器它應該在JavaScript代碼中運行功能X
。
正如你可以看到上面,存在其中JavaScript代碼可運行兩個稍微不同的情況:在頁面解析/渲染處理(當不使用所述defer
或async
屬性的script
元件被初始處理) ,之後的解析/呈現過程(延遲的腳本,以及響應事件運行的代碼)。在解析/渲染過程中運行的JavaScript可以通過document.write
函數直接將內容輸出到HTML解析器。解析/渲染完成後運行的JavaScript當然不能這樣做,但可以使用功能非常強大的DOM HTML API與DOM進行交互。
可能值得注意的是noscript
元素:在啓用JavaScript的瀏覽器中,noscript
元素被完全跳過。在沒有JavaScript或禁用JavaScript的瀏覽器中,script
元素會被完全跳過,而代之以讀取noscript
元素。這使得包含僅在呈現頁面時瀏覽器上啓用或不啓用JavaScript的內容變得很容易。
推薦閱讀: