我正在托管一个webbrowser控件,通常会加载外部文档,然后使用HTML DOM进行一些修改。
我们还使用虚假协议嵌入自定义应用程序链接,例如在BeforeNavigate2
中捕获和处理的“关闭此内容”。
当链接tarket拼写错误(例如,“spp:CloseWindow”)时,BeforeNavigate将不会触发自定义处理。浏览器控件不显示导航错误,但仍保留在READYSTATE_INTERACTIVE中,并且不会触发NavigateComplete
或DocumentComplete
。
我的问题:
大多数操作(例如,检索或更新内容)被延迟并等待状态达到READYSTATE_COMPLETE
。点击这样的无效链接后,浏览器不再更新 - 我想避免的状态。
我怎么能这样做?
"READYSTATE_COMPLETE
或READYSTATE_INTERACTIVE and last downloadComplete was broken
“)(事后看来,使用xxxx:
前缀并不是一个好主意,但现在改变它有点问题。)
答案 0 :(得分:6)
我相信Internet Explorer和Windows在UrlMon.dll中实现了可扩展的可用协议列表。请参阅此处了解IE architecture。
您无法在BeforeNavigate中检测到错误协议的原因是协议未知,因此不会发生真正的导航。浏览器决定显示错误页面。错误页面导航显然不会引发所有正常事件。
然而,有一种方法可以检测导航在杂草中的时间。如果您连接到Web浏览器的DocumentCompleted事件,则可以扫描与错误相关联的特定URL,或者更一般地,扫描以res://ieframe.dll开头的URL。
示例:
更简洁的方法是挂钩DWebBrowserEvents2 interface。
的NavigateError答案 1 :(得分:0)
我们在托管网络浏览器控件( Google地图)时出现问题,因为我们会收到导航已完成通知(NavigateComplete
),但网页本身没有完成渲染。为解决此问题,我们添加了一个notifyInitialised
javascript函数,该函数只是导航到'app:// onInitialised' - 您正在使用的类似机制。
也许你可以这样(如果你可以控制用户导航到的页面)。您可以添加此通知机制并在代码中检查它。如果在规定的超时后没有收到,你可以假设出错了并显示相关信息。
如果您有兴趣,我们还使用了一种机制,可以直接调用我们在here和here所述的C ++代码中调用javascript函数。