再谈脚本执行
前面所有的示例,Foxtable段都是通过ExecuteScriptAsync方法执行前端JS脚本的。
WebViewer还有另一个更为强大用于执行JS脚本的方法ExecuteScriptWithResultAsync。
ExecuteScriptWithResultAsync返回的值为CoreWebView2ExecuteScriptResult,该类型有以下成员:
| Succeeded | 逻辑值,表示脚本是否成功执行(无未处理的异常) |
| ResultAsJson | 脚本执行结果的 JSON 字符串形式(成功时可用) |
| Exception | 如果脚本执行失败,这里包含详细的异常信息 |
| TryGetResultAsString | 如果 Succeeded 为真且脚本执行结果是字符串,该方法会给出字符串结果的值 |
示例一
'''
Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
result =
Await
wv.CoreWebView2.ExecuteScriptWithResultAsync(
"document.getElementById('txtProduct').value"
)
If
result.Succeeded
Then
'
获取
JSON 结果
Dim
jsonResult
As
String
= result.ResultAsJson
MessageBoxA.Show("JSON结果:"
& jsonResult)
'
如果确定结果是字符串,可以直接获取字符串值
Dim
strResult
As
String
=
""
Dim
isSuccess
As
Integer
= 0
result.TryGetResultAsString(strResult, isSuccess)
'如果成功,会将isSuccess为1
If
isSuccess = 1
Then
MessageBoxA.Show("字符串结果:"
& strResult)
End
If
Else
'
处理错误
Dim
ex = result.Exception
MessageBoxA.Show("错误:"
& ex.Message &
"行号:"
& ex.LineNumber)
End
If
提示:
如果代码和执行前端脚本相关,尽量用MessageBoxA,而不是MessageBox,如果希望等待用户关闭对话框后再继续执行后续代码,可以加上 Await,例如:
Await
MessageBoxA.Show("错误:"
& ex.Message &
"行号:"
& ex.LineNumber)
示例二
'''
Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
'执行一个不存在的函数
Dim
result =
Await
wv.CoreWebView2.ExecuteScriptWithResultAsync("undefinedFunction();")
If
Not
result.Succeeded
Then
Dim
ex = result.Exception
'
组合成一个消息框
MessageBoxA.Show(
"错误类型:
"
& ex.Name & vbCrLf &
"错误消息:
"
& ex.Message & vbCrLf &
"错误位置:
第"
& ex.LineNumber &
"行,
第"
& ex.ColumnNumber &
"列"
& vbCrLf &
"完整详情:
"
& ex.ToJson()
)
End
If