2009-07-30 156 views
2

我主持WebBrowser控件,这通常加载外部文件,然后使得使用HTML DOM一些修改。WebBrowser控件:检测导航故障

我们还嵌入如使用假协议自定义应用程序的链接,“关闭此”被抓住并BeforeNavigate2处理。

当链路tarket拼写错误(比如, “属:CloseWindow”),BeforeNavigate不会触发自定义处理。浏览器控件不显示的导览树状图的错误,但仍保留在READYSTATE_INTERACTIVE并且不火NavigateCompleteDocumentComplete


我的问题: 大多数操作(例如检索或更新的内容)被延迟和等待readyState的到达READYSTATE_COMPLETE。点击这样无效的链接后,浏览器不会再更新 - 这是我想避免的状态。 我该怎么做?

  • 我可以在“DownloadComplete”中检测到导航失败吗? (这样我就可以放松了测试"READYSTATE_COMPLETEREADYSTATE_INTERACTIVE and last downloadComplete was broken“)
  • 我可以‘重置’浏览器控件READYSTATE_COMPLETE(可能不是)
  • 我能检测通过浏览器实际支持pseudoprotocols?

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

回答

5

Internet Explorer和Windows有urlmon.dll中实现可用的协议的可扩展列表,我相信,看这里有点ab out IE architecture

不能检测BeforeNavigate坏协议的原因是,该协议是未知的,所以没有真正的导航正在发生的事情。浏览器决定显示错误页面。错误页面导航并不明显引发所有正常事件。

然而,有一种方法,当导航在杂草已经被检测到。如果您连接到Web浏览器的DocumentCompleted事件,则可以扫描与错误相关的特定URL,或者更一般地,扫描以res://ieframe.dll开头的URL。

例子:

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

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

0

我们托管的时候在一个Web浏览器控件(谷歌地图),我们会通知导航完成(NavigateComplete),但是网页本身并没有完成呈现出了毛病。为了解决这个问题,我们添加了一个notifyInitialised JavaScript函数,该函数简单地导航到'app:// onInitialised' - 一种您正在使用的类似机制。

也许你可能是这样的东西(如果你可以控制用户导航到的页面)。您可以添加此通知机制并在您的代码中检查它。如果在规定的超时后没有收到,您​​可以假设出现问题并显示相关消息。

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