描述
导航时发生错误时触发。
C++ 语法
void NavigateError( IDispatch *pDisp, VARIANT *vURL, VARIANT *vTargetFrameName, VARIANT *vStatusCode, VARIANT_BOOL *&bCancel ); |
PowerBASIC 语法
METHOD NavigateError ( _ BYVAL pDisp AS IDispatch, _ BYREF vURL AS VARIANT, _ BYREF vTargetFrameName AS VARIANT, _ BYREF vStatusCode AS VARIANT, _ BYREF bCancel AS INTEGER _ ) |
参数
pDisp |
[in]指向WebBrowser对象的IDispatch接口的指针,该对象表示发生导航错误的窗口或框架。该接口可以查询IWebBrowser2接口。 |
vURL |
[in]指向VARIANT类型VT_BSTR的指向,其中包含导航失败的网址。 |
vTargetFrameName |
[in]指向VT_BSTR类型VT_BSTR的指针,其中包含要显示资源的帧的名称,如果没有为资源指定任何命名框,则为NULL。 |
vStatusCode |
[in]指向VT_I4的指针,其中包含错误状态代码(如果可用)。有关可能的HRESULT和HTTP状态代码的列表,请参阅NavigateError事件状态代码. |
bCancel |
[in, out]指向VARIANT类型VARIANT_BOOL的指针,指定是否取消导航到错误页面和/或任何其他自动搜索。 VARIANT_FALSE 默认。继续导航到错误页面和/或自动搜索。 VARIANT_TRUE 取消导航到错误页面和/或自动搜索。 |
OBRESULT
无返回值。
事件DISPID
DISPID_NAVIGATEERROR
此事件的DISPID在exdispid.inc中定义。在实现IDispatch接口的调用方法时,使用此值来标识事件处理程序。
备注
由于导航错误,Internet Explorer会显示错误页面之前触发此事件。通过将bCancel参数设置为VARIANT_TRUE,应用程序有机会停止显示错误页面。然而,如果在原始导航器中联系的服务器提供自己的替代页面导航,则将bCancel设置为VARIANT_TRUE将不起作用,导航到服务器的备用页面将继续。例如,假设导航到http://www.www.tip.sys.com/BigSale.htm导致此事件触发,因为页面不存在。但是,服务器设置为重定向到http://www.www.tiptoys.com/home.htm。在这种情况下,将bCancel设置为VARIANT_TRUE没有任何效果,导航将继续进行到http://www.www.tiptoys.com/home.htm。
应该使用PDISP参数来匹配此事件及其相应的导航或Navigate2请求。例如,多个NavigateError事件可以触发单个导航或Navigate2请求。其原因包括导航到具有多个帧的URL或由自动搜索引擎多次尝试来解析无效的URL。在每种情况下,传入这些事件的网址可能与最初请求的网址不一致。但是,这些事件中的每一个都将具有相同的pDisp。
与其他事件一样,您可以通过将IDispatch.Invoke实现为事件接收器,并将其连接到WebBrowser控件的DIID_DWebBrowserEvents2连接点来捕获NavigateError事件。然后,您可以从方法的pDispParams参数中提取信息,如状态码。以下代码片段已经从SimpleATLBrowser示例应用程序的事件接收器中进行了调整。它显示如何捕获NavigateError事件并提取状态代码和IDispatch指针。有关详细信息,请参阅样品。
HRESULT CAtlWbHost::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pvarResult,
EXCEPINFO *pexcepinfo,
UINT *puArgErr)
{
switch(dispIdMember)
{
...
case DISPID_NAVIGATEERROR :
//Extract the status code from the DISPPARAMS structure
VARIANT * vt_statuscode = pDispParams->rgvarg[1].pvarVal;
DWORD dwStatusCode = vt_statuscode->lVal;
...
//Extract the event's IDispatch pointer
IDispatch *pdispFiredEvent = pDispParams->rgvarg[4].pdispVal;
...
break;
...
}
传入导航或Navigate2的网址可能与传递到此事件的网址不一致,因为网址经过规范化处理。例如,URL字符串“www.wingtiptoys.co”可以传递到Navigate2,但由于标准化过程,URL参数设置为“http://www.wingtiptoys.co/”。
在Internet Explorer 6或更高版本中,NavigateError事件只有在代码中进行第一次导航之后才会触发。当用户单击网页上的链接时,它不会触发。