2011-02-01 78 views
1

DocumentComplete事件的文檔中提到接近尾聲:檢索從SHDOCVW web瀏覽器控件的「最高級別幀」

在裝載過程中,最高 水平框架,其不一定是 的頂級別框架,最終觸發事件的DWebBrowserEvents2 :: DocumentComplete 事件。此時,pDisp 參數與最高級別 幀的IDispatch 接口指針相同。

最高級別框架和頂級框架之間的區別是什麼,以及如何獲得最高級別框架的引用?

回答

2

假設您有一個網站,其頂級框架集合包含頂部的橫幅框架,左側的菜單框架和右側的內容框架。菜單框中的每個錨點元素都具有設置爲內容框架的目標屬性。每個內容頁面上都有一些iframe可以作爲菜單項的目標頁面。

現在您單擊左側的菜單鏈接。框架集本身不會改變,菜單框也不會改變。唯一正在導航的框架是內容框架,即導航中最高級別的框架。

您可以從第一個NavigateComplete2事件的參數中獲取最高級別​​導航框架的引用。 IE然後解析內容頁面上的幀,看看是否有其他幀要加載。其他NavigateComplete2和DocumentComplete2事件在加載內容頁面上的其餘iframe時引發,最後引發內容框架的DocumentComplete2事件。

+0

感謝您的詳細解釋。NavigateComplete的自頂向下傳播和DocumentComplete的自下而上傳播也很有幫助。 – ide 2011-02-02 01:39:42

1

如果您正在測試以查看文檔是否已真正加載,則有更好的方法來測試此特定事件(即:pDisp對象)。看看我的一些瀏覽器控制相關的答案。

所以在這裏,你想在NavComplete和DocComplete之間運行一個差異計數器,但是,如果你正常這樣做,它將無法工作,因爲NavComplete在很多幀上被多次調用,所以你需要檢查看看被調用的NavComplete是否是唯一的。在VB中,它只是使用Is運算符將一個對象與另一個對象進行比較,在C#中,我明白Is不可用,因此您只需進行普通對象比較。

因此,您保留NavComplete發佈的每個pDisp對象的列表,並且在添加每個pDisp對象之前,檢查整個集合以確保添加的pDisp尚未添加(即:是唯一的),例如:If pDisp Is pDispCollection(i) Then和「我」是你在每個循環中的增量計數器。

現在,DocComplete帖子的pDisp總是獨一無二的(所以你不必擔心它會爲每個新的/獨特的pDisp多次調用),所以每次發生pDisp時,都會發現它是哪一個從集合中刪除它。

一旦你在0,你知道它已經真正完成:)。

還有其他的東西需要測試,但這是一個很重要的主要問題,並且會增加你的準確性(比檢查.busy和.readystate更重要)。

讓我知道它是如何去的,或者如果你需要更多的幫助。