回覆列表
-
1 # 使用者4117956353079
-
2 # 佳期如夢將至
你的這個javascript指令碼通常會在一個HTML頁面裡面執行。所以如果你的字串裡面沒有<html>標籤,直接就是內容<input type="text" value="123">,那麼可以透過doucment.createElement建立一個div,然後把這個div的innerHTML設定成你的字串。再把這個div append到doucmnet下面人任何一個元素裡(通常就是body元素),這樣就可以document.getElementById來獲取了。用完之後如果不需要了,再從dom tree裡把這個元素移除掉,或者就把這個div設定為display="None"就好但是如果這個字串是完整的HTML,包括<html><head><body>等標籤,那麼就需要建立一個新的iframe,把這個iframe的innerHTML設定成你的字串,然後透過iframe的document的getElementById來獲取。
我覺得會。 我的一些理解: 頁面呈現過程是:
1、取回html程式碼,從上往下進行解析。
2、解析我覺得就是構建dom樹和render樹以及renderlayer樹,前面是html各節點的結構樹,後兩棵用於渲染頁面。構建dom樹我理解為,比如說我遇到就構建一個html節點,後面遇到我就把html視為父親節點,節點存放指向body。一直遇到代表後面沒有了子節點。
3、如果構建dom樹過程中遇到了script、img或者css就載入進來,我用chrome的時候,發現這些資源是並行載入的,就是傳送請求的時間一樣。(這裡就有個小問題想請教,如果構建dom樹是從上往下的話,應該遇到這些標籤時間應該有先後,那麼chrome是怎麼實現的並行額?)
4、dom樹構建和render樹構建renderlayer樹構建是同時進行的,第3點說到遇到script就載入,載入完後會馬上執行,所以dom樹後續節點並不能構建,這裡就會發生執行阻塞了。 注:js單執行緒的相關知識說js引擎和渲染不是同一執行緒,這裡跟js阻塞渲染不矛盾,因為dom樹構建到script標籤時候,後續節點被阻塞構建,但是可能render樹和renderlayer樹還在構建(前面的節點),這兩樹構建(實際上dom樹構建我懷疑也在渲染執行緒裡面)屬於渲染執行緒。所以這時就是js在執行,渲染在工作,符合兩執行緒的特點。