从SHDocVw WebBrowser控件中检索“最高级别的帧”

时间:2011-02-01 23:03:38

标签: windows internet-explorer webbrowser-control shdocvw

DocumentComplete事件的文档在结尾附近提及:

  

在装载过程中,最高   水平框架,不一定   顶级框架,射击决赛   DWebBrowserEvents2 ::的DocumentComplete   事件。这时,pDisp   参数与IDispatch相同   最高级别的接口指针   帧。

最高级别帧和顶级帧之间有什么区别,以及如何获得对最高级别帧的引用?

2 个答案:

答案 0 :(得分:2)

假设您的网站具有顶级框架集,其顶部包含横幅框架,左侧包含菜单框架,右侧包含内容框架。菜单框中的每个锚元素都具有设置为内容框架的目标属性。每个内容页面上都有一些iframe,它们是菜单项的目标页面。

现在单击左侧的菜单链接。框架集本身不会改变,菜单框架也不会改变。导航的唯一框架是内容框架,即导航中的最高级别框架。

您可以从第一个NavigateComplete2事件的参数中获取最高级别​​导航框架的引用。 IE然后解析内容页面上的帧以查看是否有其他要加载的帧。当加载内容页面上的其余iframe时,引发了其他NavigateComplete2和DocumentComplete2事件,最后针对内容框架引发了DocumentComplete2事件。

答案 1 :(得分:1)

如果您要执行此操作以测试文档是否已真正加载,则有更好的方法来测试此特定事件(即: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)。

让我知道它是怎么回事,或者你是否需要更多的帮助。