WebBrowser DocumentCompleted事件不止一次地被触发
我一直在研究这个东西,似乎每个人都同意,解决scheme是检查Web浏览器的ReadyState
,直到设置为完成。
但实际上事件有时会被启动ReadyState
设置为完成几次。
我不认为有一个蹩脚的.NET WebBrowser的解决scheme,但如果我使用底层的DOM组件可能会有一个解决scheme。
唯一的问题是,我不知道如何访问WebBrowser后面的DOM组件来触发DocumentCompleted事件。
DocumentCompleted将针对网页中的每一帧进行触发。 困难的方法是计数帧,告诉你如何访问DOM:
private int mFrameCount; private void startNavigate(string url) { mFrameCount = 0; webBrowser1.Navigate(url); } private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { mFrameCount += 1; bool done = true; if (webBrowser1.Document != null) { HtmlWindow win = webBrowser1.Document.Window; if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false; } if (done) { Console.WriteLine("Now it is really done"); } }
简单的方法是检查完成加载的URL:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.Equals(webBrowser1.Url)) { Console.WriteLine("Now it is really done"); } }
如果页面使用Javascript或<meta refresh>
redirect到另一个页面,可能会发生这种情况。
如果是这样,没有好的解决方法。
我找不到任何能够100%确定的东西。 提到的例子(e.Url.Equals(webBrowser1.Url))可能适用于简单的WebBrowser.Navigate(url),但是在我的情况下,我单击代码中的节点以在现有框架中打开新框架。 大多数时间“导航”和“文件完成”的火灾将是相同的,但也不总是。 “isBusy = false”和“ReadyState = Complete”将始终处于完成状态(至less目前为止),但在加载时也会出现几次这种状态。 计数框架对我来说似乎也没用,在一种情况下DocumentCompleted被激发了23次,但是所有的框架和子(sub-sub等等)框架总共是14个。
似乎工作的唯一的东西是等待一段时间(1或2秒?),看看是否有任何事情发生(任何事件触发,任何状态改变)。
嗯,我find了另一个解决scheme。 通常我们对被加载的整个页面不感兴趣,通常我们想要某些元素存在。 因此,在每个DocumentCompleted之后,当“isBusy = false”和“ReadyState = Complete”时,如果这个元素存在,我们可以searchDOM。