NavigationCompleted
NavigationCompleted在整个页面(包括所有资源,例如图片)都加载完成后执行,用于监听导航操作完成(成功/失败/取消)的状态,是处理页面加载后逻辑、错误捕获、导航结果判断的关键。
e参数属性:
| 属性名 | 类型 | 说明 |
|---|---|---|
| IsSuccess | Boolean | 导航是否成功 |
| WebErrorStatus | CoreWebView2WebErrorStatus | 导航失败时的错误状态码 |
| NavigationId | ULong | 导航的唯一标识 |
| HttpStatusCode | Integer | HTTP 导航的状态码(如200/404/500);非HTTP导航(如 file://)、导航未收到响应时为 0 |
NavigationCompleted事件和DOMContentLoaded事件一样,可以运行js代码,或注入css样式和js函数,或插入、删除、修改html元素,但这些操作更适合在DOMContentLoaded事件执行。
NavigationCompleted更多是在导航结束后做个"总结",例如如果导航成功,则将窗口标题设置为网页标题,如果导航失败,则提示具体的失败原因。
示例
提示:本示例中详细的错误处理代码只是为了演示如何捕获不同类型的错误。在实际开发中,WebViewer
和普通浏览器一样会自动提示大多数导航错误,通常无需手动处理。
NavigationCompleted事件代码:
Dim
wv
As
WebViewer = e.Sender.WebViewer
If
e.IsSuccess
Then
Dim
pageTitle
As
String
=
Await
wv.CoreWebView2.ExecuteScriptAsync("document.title")
'获得网页标题
e.Form.Text = pageTitle.Trim("""")
'将窗口标题设置为网页标题
Else
If
e.HttpStatusCode = 404
Then
'404错误
MessageBox.Show("错误:页面不存在(404)",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
'其他错误
Select
Case
e.WebErrorStatus
' SSL证书相关错误
Case
CoreWebView2WebErrorStatus.CertificateCommonNameIsIncorrect
MessageBox.Show("错误:SSL证书通用名与网址不匹配",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.CertificateExpired
MessageBox.Show("错误:SSL证书已过期",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.ClientCertificateContainsErrors
MessageBox.Show("错误:SSL客户端证书包含错误",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.CertificateRevoked
MessageBox.Show("错误:SSL证书已被吊销",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.CertificateIsInvalid
MessageBox.Show("错误:SSL证书无效(如签名不被信任、密钥过弱等)",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
'
网络连接相关错误
Case
CoreWebView2WebErrorStatus.ServerUnreachable
MessageBox.Show("错误:目标服务器无法访问",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.Timeout
MessageBox.Show("错误:网络连接超时,请检查网络",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.ConnectionAborted
MessageBox.Show("错误:网络连接被中止(如页面调用window.stop())",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.ConnectionReset
MessageBox.Show("错误:网络连接被重置",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.Disconnected
MessageBox.Show("错误:互联网连接已断开",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.CannotConnect
MessageBox.Show("错误:无法建立到目标服务器的连接",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.HostNameNotResolved
MessageBox.Show("错误:域名解析失败(DNS错误)",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
' HTTP相关错误
Case
CoreWebView2WebErrorStatus.ErrorHttpInvalidServerResponse
MessageBox.Show("错误:服务器返回无效或无法识别的HTTP响应",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.RedirectFailed
MessageBox.Show("错误:页面重定向失败",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.ValidAuthenticationCredentialsRequired
MessageBox.Show("错误:需要有效的身份验证凭据(HTTP
"
& e.HttpStatusCode &
")",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.ValidProxyAuthenticationRequired
MessageBox.Show("错误:需要有效的代理身份验证凭据(HTTP
"
& e.HttpStatusCode &
")",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
'
操作取消/未知错误
Case
CoreWebView2WebErrorStatus.OperationCanceled
MessageBox.Show("提示:导航已被取消(主动拦截/快速跳转)",
"导航取消",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Case
CoreWebView2WebErrorStatus.Unknown
MessageBox.Show("错误:发生未知导航错误",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Case
CoreWebView2WebErrorStatus.UnexpectedError
MessageBox.Show("错误:发生意外的导航错误",
"导航失败",
MessageBoxButtons.OK, MessageBoxIcon.Error)
'
兜底(防止枚举扩展
Case
Else
MessageBox.Show("导航失败:"
& e.WebErrorStatus &
"(错误码:"
&
CInt(e.WebErrorStatus)
&
")",
"错误",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End
Select
End
If
End
If