DocumentComplete事件的文档在结尾处提到:
在加载过程中,最高级别的框架(不一定是顶级框架)会触发最终的 DWebBrowserEvents2::DocumentComplete 事件。此时pDisp参数与最高级帧的IDispatch接口指针相同。
最高级别框架和顶级框架有什么区别,如何获得对最高级别框架的引用?
DocumentComplete事件的文档在结尾处提到:
在加载过程中,最高级别的框架(不一定是顶级框架)会触发最终的 DWebBrowserEvents2::DocumentComplete 事件。此时pDisp参数与最高级帧的IDispatch接口指针相同。
最高级别框架和顶级框架有什么区别,如何获得对最高级别框架的引用?
假设您有一个网站,它有一个顶级框架集,其中包含顶部的横幅框架、左侧的菜单框架和右侧的内容框架。菜单框架中的每个锚元素都有一个设置为内容框架的目标属性。每个内容页面上都有一些 iframe,它们将成为菜单项的目标页面。
现在您单击左侧的菜单链接。框架集本身不会改变,菜单框架也不会改变。唯一正在导航的框架是内容框架,即导航中的最高级别框架。
您可以从第一个 NavigateComplete2 事件的参数中获取最高级别导航框架的引用。IE 然后解析内容页面上的框架以查看是否有额外的框架要加载。加载内容页面上的其余 iframe 时引发了额外的 NavigateComplete2 和 DocumentComplete2 事件,最后引发了内容框架的 DocumentComplete2 事件。
如果您这样做是为了测试文档是否已真正加载,则有更好的方法来测试此特定事件(即:pDisp 对象)。看看我的一些 webbrowser-control 相关的答案。
所以在这里,你想在 NavComplete 和 DocComplete 之间运行一个差异计数器,但是,如果你正常执行它,它将无法工作,因为 NavComplete 在许多帧上被多次调用,所以你需要检查 NavComplete 是否被称为是独一无二的。在 vb 中,它只是使用 Is 运算符将一个对象与另一个对象进行比较,在 C# 中,我理解 Is 不可用,因此您只需进行普通对象比较。
因此,您保留 NavComplete 已发布的每个 pDisp 对象的列表,并且在添加每个对象之前,检查整个集合以确保之前未添加过要添加的 pDisp(即:是唯一的),例如:If pDisp Is pDispCollection(i) Then
和“ i" 是每个循环中的增量计数器。
现在,DocComplete 帖子的 pDisp 始终是唯一的(因此您不必担心每个新的/唯一的 pDisp 都会多次调用它),因此每次发生 pDisp 时,您只需从集合中找到它,并将其删除。
一旦你处于 0,你就知道它已经真正完成了:)。
您还需要测试其他事情,但这是一个重要/主要的重要事情,并且会大大提高您的准确性(不仅仅是检查 .busy 和 .readystate)。
让我知道进展如何,或者您是否需要更多帮助。