检测WebBrowser完整页面加载

Nei*_*ir0 56 c# webbrowser-control winforms

如何检测System.Windows.Forms.WebBrowser控件何时完成加载?

我尝试使用Navigate和DocumentCompleted事件,但在文档加载期间它们都被引发了几次!

Pau*_* pk 35

我认为该DocumentCompleted事件将被加载所有加载的子文档(例如JS和CSS).你可以看一下WebBrowserDocumentCompletedEventArgsDocumentCompleted和查询的网址财产和比较,为主页的网址.

  • @Loren Pechtel我很害怕说这种方法存在3个问题.首先,当您的父级(顶级)网址执行服务器端网址重定向时,文档的网址会尝试与更改进行比较.其次,有一个框架的情况和父页面具有相同的url,这改变了其他参数如referrer等的行为,所以url是相同的.另外,客户端重定向 - 它们发生在您认为页面已加载并且webbrowser控制返回"一切都好"之后.如果你想要如何减少这些,请告诉我,我可以在这里提供答案. (6认同)

Kyl*_*ndo 29

我做了以下事情:

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

  //The page is finished loading 
}
Run Code Online (Sandbox Code Playgroud)

加载的最后一页往往是导航到的页面,所以这应该有效.

这里开始.

  • 奇迹般有效...除了它确实有效. (4认同)

ePa*_*dit 17

以下应该有效.

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //Check if page is fully loaded or not
    if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        return;
    else
        //Action to be taken on page loading completion
}
Run Code Online (Sandbox Code Playgroud)


She*_* 蒋晟 13

请注意,由于服务器传输或网址规范化,DocumentCompleted中的网址可能与导航网址不同(例如,您导航到www.microsoft.com并在documentcomplete中获得http://www.microsoft.com)

在没有框架的页面中,此事件在加载完成后触发一次.在具有多个框架的页面中,此事件针对每个导航框架触发(框架内支持注释导航,例如,单击框架中的链接可将框架导航到另一个页面).最高级别的导航框架(可能是也可能不是顶级浏览器)会触发最终的DocumentComplete事件.

在本机代码中,您将比较DocumentComplete事件的发送者,以确定事件是否是导航中的最终事件.但是,在Windows窗体中,发送者参数不包含在WebBrowserDocumentCompletedEventArgs中.您可以接收本机事件以获取参数的值,或者检查浏览器readystate属性或DocumentCompleted事件处理程序中的框架文档,以查看是否所有帧都处于就绪状态.

使用readystate方法存在一个问题,就好像存在下载管理器并且导航是可下载文件一样,导航可以被下载管理器取消,并且就绪状态将不会完成.


小智 5

我遇到了多个DocumentCompleted触发事件的相同问题,并尝试了上述所有建议。最后,似乎在我的情况下,IsBusy属性和Url属性都不起作用,但这ReadyState似乎是我所需要的,因为它在加载多个帧时具有“交互式”状态,并且只有在加载最后一个帧后才获得“完成”状态. 因此,我知道页面何时完全加载了其所有组件。

我希望这也可以帮助其他人:)