2013-09-29 25 views
3

基於MSDN上的這篇文章:How To Determine When a Page Is Done Loading in WebBrowser Control,以及過去關於StackOverflow的討論,我會假設在具有多個框架的文檔的情況下,DocumentComplete事件會多次觸發,最後一次是頂層框架。爲什麼Webbrowser控件首先爲頂級框架觸發了DocumentComplete事件?

但是,使用上述MSDN鏈接中的確切示例代碼,我發現如果在執行導航到URL時存在多個DocumentComplete事件,則第一次在以下代碼中滿足條件,而不是上次正如文章似乎表明的那樣。由於條件失敗,因此DocumentComplete的後續調用似乎適用於較低級別的框架。

IUnknown* pUnk; 
LPDISPATCH lpWBDisp; 
HRESULT hr; 
pUnk = m_webBrowser.GetControlUnknown(); 
ASSERT(pUnk); 
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp); 
ASSERT(SUCCEEDED(hr)); 
if (lpDisp == lpWBDisp) 
{ 
    // Top-level Window object, so document has been loaded 
    TRACE("Web document is finished downloading\n"); 
} 
lpWBDisp->Release(); 

我不知道爲什麼我觀察到的行爲與它應該按照文檔所做的完全相反。任何指針在這將不勝感激。

背景:我在基於對話框的VC++/MFC應用程序中使用此代碼,並且在DocumentComplete事件中我想在文檔完全加載時獲得某些統計信息。所以我試圖使用上面的代碼來檢測DocumentComplete觸發的一個特定實例,當頁面完全加載時。

+0

注意:我正在調試與http://www.microsoft.com等URL對應的網頁的初始加載,並沒有考慮進一步的用戶操作,例如點擊頁面上的鏈接。多個DocumentComplete事件都是對應於初始頁面加載(我相信頁面的每一幀都有一個) –

回答

4

IMO,當頁面已經完全加載到收到通知的最可靠的方法是重視window.onload DOM事件上window對象(IWebBrowser2::get_DocumentIHTMLDocument2::get_parentWindow),當DocumentComplete被解僱首次爲一個特定導航。然後,當所有內部幀已經被加載時,頂部網頁的onload事件將被觸發。 This answer說明如何在C#中完成它,並且this answer可能有助於在C++中完成它。

+1

+1已確認。這對我有效。 –

0

MSDN文檔對我來說似乎是正確的:最後的DISPID_DOCUMENTCOMPLETE是爲主框架啓動的。

爲鏈接給我的最後http://www.microsoft.com/fr-fr/default.aspx這是單個幀我無法重現你的問題了http://www.microsoft.com/

我不喜歡示例代碼測試主瀏覽器的方式(等於2個IDispatch指針)。我做的是這樣的:

  1. QueryInterfaceIDispatch一個IWebBrowser2
  2. 做一個真正的COM平等的測試,即從2 IWebBrower2「比較IUnknown」(我從CComPtrIsEqualObject方法去做
相關問題