webbrowser-control - 为什么首先为顶级框架触发 Webbrowser 控件 DocumentComplete 事件?

标签 webbrowser-control frames mshtml

基于 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_DocumentIHTMLDocument2::get_parentWindow)的 DOM 事件,当 DocumentComplete 为第一次为特定导航触发。然后,当所有内部框架都已加载时,顶部网页的 onload 事件将被触发。 This answer说明如何在 C# 和 this answer 中完成可能有助于在 C++ 中完成它。

关于webbrowser-control - 为什么首先为顶级框架触发 Webbrowser 控件 DocumentComplete 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080224/

相关文章:

javascript - 从另一个框架中获取选定的文本

c# - HTML遍历很慢

c# - WebBrowser OnPropertyChange 事件未触发

javascript - 是否可以防止 WebBrowser 控件由于调用 window.close() 的脚本而被释放?

c# - 如何从 BackgroundWorker 调用 WebBrowser.Navigate()?

delphi - 如何实例化不同的帧类型?

javascript - 框架 + Internet Explorer 怪癖

MSHTML 教程

vb6 - 如何在 VB6 中使用 MSHTML Parser 去除所有 HTML 标签?

c# - 在自定义应用程序中托管 MS Office 文档的更好选择?