基于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的步骤
- 先在Form1的private段声明一个TStringList变量:
FElementValues: TStringList;
- 在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;
- 修改之前的
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
相关产品推荐
相关产品推荐

