为什么WebBrowser_DocumentCompleted()会触发两次?

时间:2010-02-24 19:26:45

标签: c# .net navigation browser

好吧,我使用一个简单的webbrowser控件来浏览页面,所以我需要在这样做时更改表单的Text。我正在使用 -

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     this.Text += " - " + webBrowser1.Document.Domain;
}

但是使用断点,我注意到,这个事件发射了两次。我甚至试过_Navigated()事件。它也开了两次。导致标题为"Webber - google.co.in - google.co.in" ..

我也注意到这个事件在加载msn.com时多次激活..我只是在页面完全加载时才尝试更改表单的文本..

任何补救措施?

9 个答案:

答案 0 :(得分:26)

您可以在触发事件时检查WebBrowser.ReadyState:

if (browser.ReadyState != WebBrowserReadyState.Complete)
    return;

一旦整个文档准备就绪,ReadyState将设置为Complete。

答案 1 :(得分:17)

每次加载一帧时,都会触发该事件。

此外,在你去那里之前,IsBusy属性只有True,而第一帧没有加载。

void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 

  //The page is finished loading 
}

答案 2 :(得分:3)

每帧会被触发一次。

答案 3 :(得分:3)

我遇到了同样的问题,原因是,默认情况下,当您添加控件时,它会生成这样的设计器代码。

this.webBrowser1.Url =  new System.Uri("", System.UriKind.Relative);

如果您在致电

后更改了网址
InitializeComponent();
WebBrowser.Navigate("NewUrl.com");

它将加载两个不同的页面:关于:空白 NewUrl.com

只是,删除设计师代码......然后你就会停止“双重”事件。

答案 4 :(得分:3)

如果两次射击是个问题,那么这应该有效:

  string body="";

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (body == webBrowser1.Document.Body.InnerHtml) return;
        body = webBrowser1.Document.Body.InnerHtml;

        // Here is something you want
    }

答案 5 :(得分:1)

当您每次订阅此活动时导航到URL时,您可能会多次订阅此活动,例如您的某种方法。

要解决此问题,请将该行移出该方法,并将其放在其他只能在每个实例调用一次的位置。在类的构造函数中......也许应该解决你的问题。

答案 6 :(得分:0)

How To Determine When a Page Is Done Loading in WebBrowser Control DocumentCompleted是WinForms的DocumentComplete外翻包装器,但WebBrowserDocumentCompletedEventArgs隐藏了sender参数,因此您无法分辨哪个帧正在引发事件。 或者,您可以查看WebBrowser.ReadyState

答案 7 :(得分:0)

实际上,它并不总是被解雇。还没弄清楚为什么不呢。我有一个计时器,只是反复检查ReadyState几分钟。 (使用嵌入式浏览器控件)。

答案 8 :(得分:0)

建议

if (browser.ReadyState != WebBrowserReadyState.Complete)

当页面中有框架时,DocumentCompleted将被多次触发。这很难解决。检查网址的一些方法并不准确。

顺便说一下,为什么不用这个:

this.Text = stringA + " - " + webBrowser1.Document.Domain;

尝试使用固定前缀,问题可以轻松解决。