基于 MSDN 上的这篇文章:How To Determine When a Page Is Done Loading in WebBrowser Control ,并且从过去关于 StackOverflow 的讨论来看,我假设如果文档有多个框架,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 触发的特定实例是在页面完全加载时。
最佳答案
IMO,当页面完全加载时获得通知的最可靠方法是附加到 window.onload顶级 window
对象(IWebBrowser2::get_Document
、IHTMLDocument2::get_parentWindow
)的 DOM 事件,当 DocumentComplete
为第一次为特定导航触发。然后,当所有内部框架都已加载时,顶部网页的 onload
事件将被触发。 This answer说明如何在 C# 和 this answer 中完成可能有助于在 C++ 中完成它。
关于webbrowser-control - 为什么首先为顶级框架触发 Webbrowser 控件 DocumentComplete 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080224/