如何等待DOM操作完成?

如何等待DOM操作完成?,dom,vb6,browser,Dom,Vb6,Browser,我必须维护旧WindowsVB6项目的一部分(因此,不要告诉我将其迁移到VB.NET)。这个程序嵌入了众所周知的webbrowser控件(IE),它在其中加载本地HTML文件(包含不同的统计信息,但并不重要)。知道我们不希望web浏览器视图中出现任何滚动条(即使HTML页面比webbrowser窗口长,我们只需要查看其顶部的内容),我们可以像这样管理DocumentComplete事件上的DOM: Private Sub wb_DocumentComplete(ByVal pDisp As Ob

我必须维护旧WindowsVB6项目的一部分(因此,不要告诉我将其迁移到VB.NET)。这个程序嵌入了众所周知的webbrowser控件(IE),它在其中加载本地HTML文件(包含不同的统计信息,但并不重要)。知道我们不希望web浏览器视图中出现任何滚动条(即使HTML页面比webbrowser窗口长,我们只需要查看其顶部的内容),我们可以像这样管理DocumentComplete事件上的DOM:

Private Sub wb_DocumentComplete(ByVal pDisp As Object, URL As Variant)
 wb.Document.documentElement.Style.overflow = "hidden"
 ProcessWithDStats
End Sub
听起来不错,垂直滚动条也消失了,但是现在,我需要在ProcessWithDStats sub(一个调用很多函数的大sub)中添加一些东西,这需要确保之前的DOM操作完全完成(我的意思是:滚动条隐藏,并且它的内容根据这个新的宽度w/o滚动条重新调整)

那么,怎么办

此时,在DOM管理真正完成渲染之前执行ProcessWithDStats

到目前为止,我的尝试如下:

  • 我曾尝试在两行之间添加滚动条测试(比较文档宽度和浏览器客户端区域1),但它不起作用:测试正常,但文本回流(由于滚动条消失时宽度的变化)在ProcessWithDStats启动之前没有足够的时间应用

  • 我尝试过Sleep(),但它会锁定整个程序(包括webbrowser渲染)

那么,在这个WebBrowser控件中是否有一种方法可以等待给定DOM管理的实际应用呢

我的意思是:

Do
 Doevents
Loop Until [DOM modification and rendering completed]

你需要这样做。。。至少是这样

Do
 Sleep 100
 Doevents
Loop Until wb.Busy = False And wb.ReadyState = 4
在您的版本中,可以调用.Busy。IsBusy,但它们是相同的

此外,如果你想真正了解浏览器是否加载完毕,你还应该做一些额外的事情,如果你想知道更多,或者需要比上面更准确的答案,请阅读我以前的一些答案,但我为你提供的肯定是比你目前拥有的更好的解决方案。让我知道,如果你需要它在100%的网站上工作,或只是选择几个,如果选择几个比这个简单的方法可能就足够了


让我知道它到底是怎么回事,干杯。

您的文档是否使用框架?如果是这样,控件可能会触发多个DocumentComplete事件,您需要查看pDisp参数来判断它是否是顶级文档。如果(pDisp是WebBrowser1.Object),那么…不幸的是,没有,Beaner:没有任何帧或iframe。但自从我提出这个问题以来,我就有了一个想法,我已经尝试过了,而且似乎有效(但我认为这不是很明智;因此,一个解决方案等待着一个真正明智的解决方案)。就在这两行之间,我添加了一个伪DOM操作,它不做任何事情,但具有与之前的“溢出隐藏”操作同步的优势:doc.parentWindow.scrollBy 0,1 doc.parentWindow.scrollBy 0,-1,因此,当需要使用ProcessWithDStats时,回流已经完成。你觉得怎么样?你有更好的方法吗?听起来你的工作做得和其他方法一样好。:o)不过,如果有一天我能找到更好的方法,我会回来告诉你。。。