【问题标题】:WebBrowser control: Detect navigation failureWebBrowser 控件:检测导航失败
【发布时间】:2011-01-17 18:23:18
【问题描述】:

我正在托管一个网络浏览器控件,它通常会加载外部文档,然后使用 HTML DOM 进行一些修改。

我们还使用虚假协议嵌入自定义应用程序链接,例如在BeforeNavigate2 中捕获和处理的“关闭此”。

当链接目标拼写错误时(例如,“spp:CloseWindow”),BeforeNavigate 不会触发自定义处理。浏览器控件不显示导航错误,但仍处于 READYSTATE_INTERACTIVE 且不会触发 NavigateComplete 或 DocumentComplete。


我的问题: 大多数操作(例如检索或更新内容)都会延迟并等待就绪状态达到READYSTATE_COMPLETE。单击此类无效链接后,浏览器将不再更新-我想避免这种状态。 我该怎么做?

  • 我能否在“DownloadComplete”中检测到导航失败? (所以我可以将测试放宽到"READYSTATE_COMPLETE 或READYSTATE_INTERACTIVE and last downloadComplete was broken")
  • 我可以将浏览器控件“重置”为 READYSTATE_COMPLETE(可能不行)
  • 能否检测到浏览器实际支持的伪协议?

(事后看来,使用 xxxx: 前缀并不是一个好主意,但现在改变它有点问题。)

【问题讨论】:

    标签: c++ webbrowser-control


    【解决方案1】:

    我相信 Internet Explorer 和 Windows 在 UrlMon.dll 中实现了可用协议的可扩展列表。有关IE architecture 的信息,请参见此处。

    在 BeforeNavigate 中无法检测到错误协议的原因是协议未知,因此没有发生真正的导航。浏览器决定改为显示错误页面。错误页面导航显然不会引发所有正常事件。

    但是,有一种方法可以检测导航何时进入杂草。如果您连接到 Web 浏览器的 DocumentCompleted 事件,您可以扫描与错误相关的特定 URL,或者更一般地说,任何具有以 res://ieframe.dll 开头的 URL 的 URL。

    例子:

    • res://ieframe.dll/unknownprotocol.htm#spp:CloseWindow
    • res://ieframe.dll/dnserrordiagoff_webOC.htm#http://192...

    更简洁的方法是挂钩DWebBrowserEvents2 interface 的 NavigateError。

    【讨论】:

      【解决方案2】:

      我们在托管 Web 浏览器控件 (Google 地图) 时遇到问题,我们会收到导航已完成的通知 (NavigateComplete),但网页本身尚未完成呈现.为了解决这个问题,我们添加了一个 notifyInitialised javascript 函数,该函数只是导航到“app://onInitialised”——您正在使用的类似机制。

      也许您可以这样做(如果您可以控制用户导航到的页面)。您可以添加此通知机制并在您的代码中检查它。如果在规定的超时后仍未收到,您可能会认为出现问题并显示相关消息。

      如果您有兴趣,我们还使用了一种机制,可以从我们描述的 here 和 here 的 C++ 代码中直接调用 javascript 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        相关资源
        最近更新 更多