Navigate
方法并结合URL参数来传递数据。
在Delphi中给JavaScript传递参数,主要有以下几种方法:
1、通过WebBrowser控件
基本步骤
需要在Delphi项目中添加一个TWebBrowser控件,这个控件允许Delphi应用程序嵌入一个网页浏览器窗口,可以加载HTML页面并与其进行交互。
当需要向JavaScript传递参数时,可以通过TWebBrowser控件的Navigate
方法加载包含JavaScript代码的HTML页面,在加载页面之前,可以将需要传递的参数设置到TWebBrowser控件的Document
属性相关的对象中,例如将参数存储在一个自定义的变量或者DOM元素中,然后在JavaScript代码中读取这些参数。
示例代码
假设有一个名为webBrowser
的TWebBrowser控件,要传递的参数是param1
和param2
:
procedure TForm1.Button1Click(Sender: TObject); var doc: IHTMLDocument2; paramElement: IHTMLElement; begin webBrowser.Navigate('about:blank'); // 先导航到一个空白页 Application.ProcessMessages; // 等待浏览器加载完成 doc := webBrowser.Document as IHTMLDocument2; paramElement := doc.createElement('div'); paramElement.setAttribute('id', 'params'); paramElement.setAttribute('data-param1', 'value1'); paramElement.setAttribute('data-param2', 'value2'); doc.body.appendChild(paramElement); // 现在可以在JavaScript中通过document.getElementById('params')获取参数 end;
在对应的HTML页面(或内联JavaScript代码)中,可以使用类似以下JavaScript代码获取参数:
var paramsDiv = document.getElementById('params'); var param1 = paramsDiv.getAttribute('data-param1'); var param2 = paramsDiv.getAttribute('data-param2'); console.log(param1, param2);
2、使用ScriptGate组件(针对特定版本的Delphi)
基本步骤
ScriptGate是一个用于在Delphi和JavaScript之间进行通信的组件,如果使用的是支持该组件的Delphi版本(如Delphi Tokyo 10.2.3及更高版本),可以使用它来实现参数传递。
首先需要在项目中添加ScriptGate相关的单元和引用,通过ScriptGate的CallScript
方法调用JavaScript函数,并将参数传递给该函数。
示例代码
假设要调用一个名为myJavaScriptFunction
的JavaScript函数,并传递两个参数arg1
和arg2
:
use FMX.ScriptGate; procedure TForm1.Button1Click(Sender: TObject); begin FScriptGate.CallScript('myJavaScriptFunction', ['arg1Value', 123]); end;
在JavaScript中定义对应的函数来接收参数:
function myJavaScriptFunction(arg1, arg2) { console.log(arg1, arg2); }
3、通过CEF4Delphi注册“JavaScript扩展”
基本步骤
CEF4Delphi是一个基于Chromium Embedded Framework (CEF)的Delphi控件,用于在Delphi应用程序中嵌入强大的Web浏览器引擎,通过向CEF4Delphi注册一个“JavaScript扩展”,可以从JavaScript执行Delphi代码,并在需要时将参数传递给Delphi代码。
这涉及到从TCefv8HandlerOwn
继承创建一个自定义类,并在其中实现处理JavaScript调用的方法,在这个方法中,可以根据需要获取JavaScript传递过来的参数。
示例代码
以下是一个简单的示例,展示了如何在CEF4Delphi中创建一个JavaScript扩展并处理来自JavaScript的调用:
uses uCEFM, uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFApplication, uCEFChromiumCore, uCEFLibFunction; type TCefMyExtension = class(TCefv8HandlerOwn) protected procedure OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const message: ICefProcessMessage); override; procedure ProcessMessage(const name: ustring; const arguments: ICefV8Value; var aResult: ICefV8Value; var aException: ustring); end; procedure RegisterMyExtension(const cefWindowParent: TFmxHandle); var extension: TCefMyExtension; begin extension := TCefMyExtension.Create; extension.RegisterExtension('myExtension', cefWindowParent); end; procedure TCefMyExtension.OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const message: ICefProcessMessage); begin inherited; end; procedure TCefMyExtension.ProcessMessage(const name: ustring; const arguments: ICefV8Value; var aResult: ICefV8Value; var aException: ustring); begin if name = 'myFunction' then begin // 获取参数,例如第一个参数 if arguments.IsArray and (arguments.GetArrayLength > 0) then begin var param := arguments.GetValue(0).GetString; // 在这里处理参数,例如调用Delphi中的其他函数 ShowMessage('Received parameter from JavaScript: ' + param); end; end; end;
在JavaScript中,可以通过以下方式调用这个扩展:
chrome.runtime.sendMessage('myExtension', {name: 'myFunction', args: ['Hello from JavaScript']}, function(response) { console.log('Response from Delphi:', response); });
在Delphi中给JavaScript传参有多种方法,开发者可根据项目需求、Delphi版本以及应用场景等因素综合选择合适的方式来实现Delphi与JavaScript之间的高效参数传递与交互。