webkit中 Frame對象分析
Frame應(yīng)該是整個(gè)webcore里面最核心的對象之一,前面在講Page對象的文章中,也提到過,從Page的角度來看,其實(shí)一個(gè)Page就是由一個(gè)或者多個(gè)Frame構(gòu)成,而這些Frame是以樹狀的關(guān)系組織,我們來看一段HTML代碼
- <html>
- <body>
- hello,everyone!
- <iframesrc= "..." />
- <iframesrc= "..." />
- </body>
- </html>
在以上的html代碼中,一個(gè)Page里面就會(huì)有三個(gè)Frame,首先任何一個(gè)Page都會(huì)至少對應(yīng)一個(gè)Frame,也就是rootFrame,這個(gè)Frame不對應(yīng)iframe節(jié)點(diǎn)(Frame中的m_ownerElement對象為空),也是frame樹的根節(jié)點(diǎn),還有兩個(gè)iframe標(biāo)簽對應(yīng)兩個(gè)Frame,如果在iframe的屬性src里面指定的頁面中還含有iframe標(biāo)簽的話,那么也會(huì)對應(yīng)一個(gè)frame(一個(gè)iframe標(biāo)簽對應(yīng)一個(gè)frame),這樣frame之間就形成了父子關(guān)系
以下是Frame的一個(gè)類圖關(guān)系
其中有很多非常重要的對象,下面我們挑出幾個(gè)來分析
1. Page
Page前面文章中已經(jīng)提到過。這里表示Frame所在的Page是哪個(gè)
2. EventHander
事件處理者,我們在網(wǎng)頁上(確切的說是在一個(gè)frame上)點(diǎn)擊一個(gè)按鈕,或者移動(dòng)鼠標(biāo),首先底層會(huì)將該事件截獲然后報(bào)給WebView(Page專題中有提到),然后通過Page找到RootFrame,將該事件交給RootFrame的EventHandler,RootFrame的EventHandler如果發(fā)現(xiàn)其所在Frame有subFrame,會(huì)交給subFrame的EventHandler來處理,如果處理成功就返回,否則自己繼續(xù)處理。
3.FrameView
FrameView對應(yīng)著一個(gè)Frame的顯示,這個(gè)數(shù)據(jù)結(jié)構(gòu)也是與render引擎連接的紐帶,該結(jié)構(gòu)里面有一個(gè)非常重要的接口,叫 layout, 接口里面的內(nèi)容就是render dom樹的過程。也有一個(gè)非常重要的數(shù)據(jù)成員 RenderObject* mlayoutRootObject;表示render樹的根節(jié)點(diǎn).
在32平臺(tái)FrameView是繼承自ScrollableView
4.ScriptController
腳本相關(guān)操作的入口,我們知道,一個(gè)頁面可以執(zhí)行很多js函數(shù),這個(gè)結(jié)構(gòu)就是與js腳本相關(guān)的一個(gè)對象。
5 Document
表示一個(gè)文檔,一個(gè)html頁面解析完成,會(huì)形成一個(gè)dom樹(相關(guān)的知識(shí)請看dom規(guī)范),該結(jié)構(gòu)就是表示html頁面解析完成后的結(jié)構(gòu),每個(gè)標(biāo)簽都會(huì)在document上對應(yīng)一個(gè)節(jié)點(diǎn),這也是非常核心的一個(gè)數(shù)據(jù)結(jié)構(gòu),從MVC的角度來看,應(yīng)該是M部分。
6 DOMWindow
在bom規(guī)范中,js可以訪問一個(gè)對象,window(bom規(guī)范定義了一系列的標(biāo)準(zhǔn)接口),通過該window的接口,js用戶可以動(dòng)態(tài)的控制頁面的內(nèi)容,DOMWindow就是表示那個(gè)window接口的實(shí)現(xiàn),用一個(gè)UML的圖來表示,可以表示成如下
7. FrameLoader
頁面加載器,與頁面相關(guān)的加載都由其負(fù)責(zé),里面又包含了很多其他的對象,這也是非常重要的一個(gè)對象,后面會(huì)專門討論。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
