You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:45:37