Delphi 11中CoreWebView2的ExecuteScript首次运行后失效问题
Delphi 11 CoreWebView2 执行JS脚本二次无响应问题解决
问题描述
在Delphi 11中使用CoreWebView2调用ExecuteScript执行JavaScript脚本时:
- 仅执行
alert命令时,可多次正常运行; - 当脚本包含
alert以外的代码(如let x = 0;alert("uu");)时,首次执行正常,第二次调用无报错但无任何响应。
相关代码:
procedure TBrowserFrame.Button2Click(Sender: TObject); var s: string; begin s:= 'let x = 0;alert("uu");'; WVBrowser1.CoreWebView2.ExecuteScript(s,0,WVBrowser1); end;
原因分析
问题出在let声明的变量作用域上:CoreWebView2的ExecuteScript每次执行的脚本会共享全局上下文,第一次执行let x = 0;时会在全局作用域创建变量x,第二次执行时重复用let声明同一个变量会触发语法错误(重复声明),但CoreWebView2的ExecuteScript默认不会抛出这类错误,导致脚本静默失败。
解决方法
方法1:改用var声明变量
将let替换为var,因为var允许在同一作用域重复声明变量:
var x = 0;alert("uu");
方法2:用自执行函数隔离作用域
把脚本包裹在自执行函数中,每次执行都创建独立的局部作用域,避免变量冲突:
(function(){ let x = 0; alert("uu"); })();
方法3:检查并处理脚本执行错误
利用ExecuteScript的回调参数捕获错误,方便排查问题(Delphi中可通过实现ICoreWebView2ExecuteScriptCompletedHandler接口获取执行结果和错误信息):
type TExecuteScriptHandler = class(TInterfacedObject, ICoreWebView2ExecuteScriptCompletedHandler) public procedure Invoke(errorCode: HResult; const resultObjectAsJson: PWideChar); stdcall; end; procedure TExecuteScriptHandler.Invoke(errorCode: HResult; const resultObjectAsJson: PWideChar); begin if errorCode <> S_OK then ShowMessage('脚本执行错误: ' + SysErrorMessage(errorCode)) else if Assigned(resultObjectAsJson) then ShowMessage('执行结果: ' + string(resultObjectAsJson)); end; // 修改调用代码 procedure TBrowserFrame.Button2Click(Sender: TObject); var s: string; Handler: ICoreWebView2ExecuteScriptCompletedHandler; begin s:= 'let x = 0;alert("uu");'; Handler := TExecuteScriptHandler.Create; WVBrowser1.CoreWebView2.ExecuteScript(PWideChar(s), Handler); end;
内容的提问来源于stack exchange,提问作者Holy Thirteen
相关产品推荐
相关产品推荐

