当前位置:首页 > 行业动态 > 正文

delphi 给js传参

在Delphi中,可以通过多种方式给JavaScript传递参数。一种常见的方法是使用TWebBrowser控件,通过其 Navigate方法并结合URL参数来传递数据。

在Delphi中给JavaScript传递参数,主要有以下几种方法:

1、通过WebBrowser控件

基本步骤

需要在Delphi项目中添加一个TWebBrowser控件,这个控件允许Delphi应用程序嵌入一个网页浏览器窗口,可以加载HTML页面并与其进行交互。

当需要向JavaScript传递参数时,可以通过TWebBrowser控件的Navigate方法加载包含JavaScript代码的HTML页面,在加载页面之前,可以将需要传递的参数设置到TWebBrowser控件的Document属性相关的对象中,例如将参数存储在一个自定义的变量或者DOM元素中,然后在JavaScript代码中读取这些参数。

示例代码

假设有一个名为webBrowser的TWebBrowser控件,要传递的参数是param1param2

        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代码获取参数:

delphi 给js传参

        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函数,并将参数传递给该函数。

示例代码

delphi 给js传参

假设要调用一个名为myJavaScriptFunction的JavaScript函数,并传递两个参数arg1arg2

        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代码。

delphi 给js传参

这涉及到从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之间的高效参数传递与交互。