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

基于FireMonkey+Android,如何将JavaScript捕获的值存储到Delphi的控件、变量及集合中

基于FireMonkey+Android,如何将JavaScript捕获的值存储到Delphi的控件、变量及集合中

没问题!你已经搞定了单个HTML元素值的捕获,咱们直接扩展到多值存储的场景——不管是要放到多个Edit控件,还是存入TStringList、数组这类集合,都很容易实现。我分两种常用场景给你拆解:

一、把不同元素的值分别存入Edit2、Edit3等控件

这里有两种思路,你可以根据需求选:

1. 多次调用evaluateJavascript(简单直接)

这种方式就是在按钮点击事件里,重复调用原有的JS执行逻辑,只是每次换不同的元素ID和对应的处理函数。

首先,在你的Form1类的private段,新增两个处理结果的方法:

procedure Element2ResultHandler(Sender: TObject; const AJavaScriptResult: string);
procedure Element3ResultHandler(Sender: TObject; const AJavaScriptResult: string);

然后实现这两个方法,把结果对应到Edit2和Edit3:

procedure TForm1.Element2ResultHandler(Sender: TObject; const AJavaScriptResult: string);
begin
  Edit2.Text := AJavaScriptResult;
end;

procedure TForm1.Element3ResultHandler(Sender: TObject; const AJavaScriptResult: string);
begin
  Edit3.Text := AJavaScriptResult;
end;

最后修改Button1的点击事件,依次获取三个元素的值:

procedure TForm1.Button1Click(Sender: TObject);
var
  LWebView: JWebView;
begin
  if Supports(WebBrowser, JWebView, LWebView) then
  begin
    // 获取第一个元素到Edit1
    FJavaScriptValueCallback.OnResult := NewDateResultHandler;
    LWebView.evaluateJavascript(StringToJString('document.getElementById("ID1").innerHTML;'), FJavaScriptValueCallback);
    
    // 获取第二个元素到Edit2
    FJavaScriptValueCallback.OnResult := Element2ResultHandler;
    LWebView.evaluateJavascript(StringToJString('document.getElementById("ID2").innerHTML;'), FJavaScriptValueCallback);
    
    // 获取第三个元素到Edit3
    FJavaScriptValueCallback.OnResult := Element3ResultHandler;
    LWebView.evaluateJavascript(StringToJString('document.getElementById("ID3").innerHTML;'), FJavaScriptValueCallback);
  end;
end;

注意:evaluateJavascript是异步执行的,所以结果返回的顺序不一定和调用顺序完全一致,但每个结果都会对应到自己的处理函数,不影响最终存入对应Edit的效果。

2. 一次JS调用返回多个值(更高效)

如果想减少JS和Delphi的交互次数,可以把需要的多个元素值打包成JSON字符串,一次返回后再在Delphi里解析。

首先,确保你的代码引用了System.JSON单元(在uses里加上)。

然后,修改处理结果的方法,让它能解析JSON并分配到各个Edit:

procedure TForm1.MultiElementsResultHandler(Sender: TObject; const AJavaScriptResult: string);
var
  LJSONObj: TJSONObject;
begin
  try
    LJSONObj := TJSONObject.ParseJSONValue(AJavaScriptResult) as TJSONObject;
    if Assigned(LJSONObj) then
    begin
      Edit1.Text := LJSONObj.GetValue<string>('elem1');
      Edit2.Text := LJSONObj.GetValue<string>('elem2');
      Edit3.Text := LJSONObj.GetValue<string>('elem3');
    end;
  finally
    LJSONObj.Free;
  end;
end;

最后修改Button1的点击事件,执行打包好的JS代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  LWebView: JWebView;
  LJSCode: string;
begin
  if Supports(WebBrowser, JWebView, LWebView) then
  begin
    // 用JSON打包三个元素的值
    LJSCode := 'JSON.stringify({elem1: document.getElementById("ID1").innerHTML, elem2: document.getElementById("ID2").innerHTML, elem3: document.getElementById("ID3").innerHTML})';
    FJavaScriptValueCallback.OnResult := MultiElementsResultHandler;
    LWebView.evaluateJavascript(StringToJString(LJSCode), FJavaScriptValueCallback);
  end;
end;

二、把值存入TStringList或数组

如果需要把这些值统一管理(比如后续要在ListBox展示,或者批量处理),存入TStringList或数组就很合适。

存入TStringList的步骤

  1. 先在Form1的private段声明一个TStringList变量:
FElementValues: TStringList;
  1. 在Form的构造函数里初始化,析构函数里释放:
constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  FJavaScriptValueCallback := TJavaScriptValueCallback.Create;
  FElementValues := TStringList.Create; // 初始化列表
end;

destructor TForm1.Destroy;
begin
  FElementValues.Free; // 释放资源
  FJavaScriptValueCallback.Free;
  inherited;
end;
  1. 修改之前的MultiElementsResultHandler方法,把解析后的值添加到列表:
procedure TForm1.MultiElementsResultHandler(Sender: TObject; const AJavaScriptResult: string);
var
  LJSONObj: TJSONObject;
begin
  try
    FElementValues.Clear; // 先清空旧数据
    LJSONObj := TJSONObject.ParseJSONValue(AJavaScriptResult) as TJSONObject;
    if Assigned(LJSONObj) then
    begin
      // 添加到TStringList
      FElementValues.Add(LJSONObj.GetValue<string>('elem1'));
      FElementValues.Add(LJSONObj.GetValue<string>('elem2'));
      FElementValues.Add(LJSONObj.GetValue<string>('elem3'));
      
      // 示例:把列表内容展示到FireMonkey的ListBox
      // ListBox1.Items.Assign(FElementValues);
    end;
  finally
    LJSONObj.Free;
  end;
end;

存入数组的步骤

如果更习惯用数组,只需要在处理函数里声明动态数组并赋值即可:

procedure TForm1.MultiElementsResultHandler(Sender: TObject; const AJavaScriptResult: string);
var
  LJSONObj: TJSONObject;
  ElementArray: array of string;
begin
  try
    LJSONObj := TJSONObject.ParseJSONValue(AJavaScriptResult) as TJSONObject;
    if Assigned(LJSONObj) then
    begin
      // 初始化数组长度
      SetLength(ElementArray, 3);
      // 给数组赋值
      ElementArray[0] := LJSONObj.GetValue<string>('elem1');
      ElementArray[1] := LJSONObj.GetValue<string>('elem2');
      ElementArray[2] := LJSONObj.GetValue<string>('elem3');
      
      // 后续可以用ElementArray做批量操作,比如循环展示到界面
    end;
  finally
    LJSONObj.Free;
  end;
end;

备注:内容来源于stack exchange,提问作者João Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:04:35