【问题标题】:DocumentCompleted firing multiple times - accepted StackOverflow answer not workingDocumentCompleted 多次触发 - 接受的 StackOverflow 答案不起作用
【发布时间】:2013-08-21 17:25:55
【问题描述】:

我测试我的 WebBrowser 是否完成:

webBrowser2.DocumentCompleted += (s, e) =>
{
    // Do stuff  
}

我以大量 JS 文件和 iframe 等形式访问的网页,因此我使用以下函数来确保它是已完成加载的实际页面。

webBrowser2.DocumentCompleted += (s, e) =>
{
    if (e.Url.AbsolutePath != (s as WebBrowser).Url.AbsolutePath)
    {
        return;
    }       
    // Do stuff    
}   

但是,它似乎仍然无法正常工作。我是在做错什么,还是在语法上是正确的,而我的代码中还有其他错误?

【问题讨论】:

  • 在标题上大声笑:D
  • 比较与多次触发的处理程序有什么关系?我想我在这里遗漏了一些东西。
  • 哈哈哈我只知道有人会标记重复...也许是如果我在做一些愚蠢的事情。
  • 显然DocumentCompleted 在某些页面上触发多次,即当 iframe 加载时,当 JS 文件加载时等。我只想在整个页面加载时运行我的代码。即使我在上面插入了 if 测试,DocumentCompleted 仍然会为我的页面触发多次。
  • 第一个链接中的if (browser.ReadyState != WebBrowserReadyState.Complete) return 有什么问题?在browser.ReadyState 变为WebBrowserReadyState.Complete 之后,您还看到DocumentCompleted 事件吗?

标签: c# url browser webbrowser-control


【解决方案1】:

DocumentComplete 可能由于多种原因(帧、ajax 等)被多次触发。同时,对于一个特定的文档,window.onload 事件只会被触发一次。所以,也许,您可以在window.onload 上进行处理。我刚刚回答了related question,关于如何做到这一点。

【讨论】:

    【解决方案2】:

    只需检查 e.Url.AbsolutePath 是您导航到的实际 url。

    如果(e.Url.AbsolutePath == TheActualURLString) { //这是你的实际页面下载完成 }

    【讨论】:

    • 不太好......如果网页包含脚本,那么这些将在主网页之后加载。
    【解决方案3】:

    我使用这个(从 SO 到类似问题的答案):

    void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
            return; 
    
        //The page has finished loading.
    }
    

    【讨论】:

    • 这非常有效,但对我来说,e.Url.AbsolutePath 正在返回页面上的广告,所以我正在与我在 Navigate() 中使用的 url 进行比较,所以 if ((sender as WebBrowser).Url.AbsolutePath != targetPath)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多