WebBrowser DocumentCompleted事件多次触发

时间:2010-07-13 16:25:58

标签: c# .net

我一直在研究这些东西,每个人似乎都同意解决方案是检查Web浏览器的ReadyState,直到设置为Complete。

但事实上有时会在ReadyState设置为完成几次的情况下触发事件。

我不认为有那种糟糕的.NET WebBrowser的解决方案,但如果我使用底层DOM组件,可能会有一个。

唯一的问题是,我不知道如何访问触发DocumentCompleted事件的WebBrowser后面的DOM组件。

3 个答案:

答案 0 :(得分:32)

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");
  }
}

简单的方法是检查已完成加载的网址:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.Equals(webBrowser1.Url)) {
        Console.WriteLine("Now it is really done");
    }
}

答案 1 :(得分:0)

如果页面使用Javascript或<meta refresh>重定向到另一个页面,则可能会发生这种情况。

如果是这样,那就没有好的解决方法了。

答案 2 :(得分:0)

我找不到任何可以100%确定的东西。 提到的示例(e.Url.Equals(webBrowser1.Url))可能适用于简单的WebBrowser.Navigate(url),但是,在我的情况下,我单击代码中的节点以在现有帧中打开新帧。主要是次数&#34;导航&#34;和#34; DocumentCompleted&#34;火将是相同的,但并非总是如此。 &#34; isBusy = false&#34;和&#34; ReadyState =完成&#34;在它完成时(至少到目前为止)总会如此,但是当它仍在加载时它也会有几次这种状态。计数帧对我来说似乎也没用,在一种情况下,DocumentCompleted会被触发23次,但是,所有的帧和子(子子等)帧都是14。

似乎唯一可行的是等待一段时间(1或2秒?)以查看是否有任何事情发生(任何事件被触发,任何状态发生变化)。

嗯,我找到了另一个解决方案。通常我们对整个页面的加载不感兴趣,通常我们希望存在某些元素。因此,在每个DocumentCompleted之后,当&#34; isBusy = false&#34;和&#34; ReadyState =完成&#34;如果这个元素存在,我们可以搜索DOM。