gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:44:40 28 4
gpt4 key购买 nike

基于 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com