• 开源项目ScriptGate,Delphi与JavaScript相互调用的神器


    ScriptGate是一个实现TWebBrowser上的JavaScript和Delphi代码相互调用的库,具体在这里:https://bitbucket.org/freeonterminate/scriptgate

    用ScriptGate,我们可以轻松实现JavaScript在Delphi上的使用了,目前支持最新的Delphi tokyo 10.2.3版,注意,属于FMX类型的控件,作者说支持Windows,MacOS,Android及iOS.

    我该怎么办?


    例如,您可以从Delphi调用以下JavaScript方法。

    <head> 
      <script type = “text / javascript” > 
        function  helloJS ()
        { 
          alert (“Hello,JavaScript!” ); 
        } 
      </ script> 
    </ head>
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FScriptGate.CallScript('helloJS()');
    end;

    看清了吧,在Delphi中调用JavaScript的helloJS。

    反之,再看看从JavaScript调用Delphi方法:

    procedure TForm1.HelloDelphi()
    begin
      ShowMessage('Hello, Delphi!');
    end;
    <body>
      <a href="delphi:HelloDelphi()">Call Delphi</a>
    </body>

    注意这里的“delphi:”字符串,是TScriptGate构造函数指定的方案,不明白,那继续往下看。

    尝试使用ScriptGate


    准备工作


    首先,从BitBucket下载代码。

    接下来,在新建中的“多设备应用程序”中选择“空应用程序”。
    *当然可以将其合并到现有项目中,但仅限于FireMonkey应用项目。
    将下载并解压的代码目录添加到搜索路径。

    如果Android包含在开发目标中,请将SGWebClient.jar添加到Android的库中。

    至此,准备工作完成。

    建立TScriptGate


    这里我们将ScriptGate与WebBrowser1,TForm1结合使用。

    unit Unit1;
    
    interface
    
    uses
      {...}
      SG.ScriptGate; //手工引用此单元
    
    type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Layout1: TLayout;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private var
        FScriptGate: TScriptGate; // 增加一个FScriptGate对象
      public
        procedure HelloDelphi; // 增加一个准备在JS中调用的Delphi方法
      end;

     利用Form1的OnCreate事件,先建一个TScriptGate的实例对象FScriptGate

    implementation
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'delphi');
    end;

    TScriptGate.Create原型:

    constructor Create(
      const iReceiver: TObject;
      const iWebBrowser: TWebBrowser;
      const iScheme: String); reintroduce;
    • iReceiver

    iReceiver是一个从JavaScript接收响应的实例。
    这里TForm1被指定,但它可以是类的任何实例。
    这里指定的实例的方法可以被JavaScript调用。

    如:

    type
      TReceiver = class
      public
        procedure Foo;
        procedure Bar(const msg: String);
      end;

    如果您指定名为TReceiver 的类的实例,则可以从JavaScript调用Bar方法。
    这里需要注意的是,暴露给JavaScript的方法的访问级别必须是Public的或更高级别的。
    它使用RTTI进行方法查找。

    • iWebBrowser

    指定TScriptGate所关联的TWebBrowser的一个实例。
    您可以调用指定WebBrowser加载的JavaScript方法。

    • IScheme

    调用第一个示例中附加的iScheme ScriptGate方法“delphi:”的参数。
    这与指定本地文件时使用JavaScript或“file:”时指定的“JavaScript:”具有相同的含义。
    无论你在这里指定什么,你还必须在JavaScript端指定相同的字符串。
    请注意,传递给参数的字符串不需要冒号“:”。

    然后编写一个调用JavaScript的方法和一个从JavaScript调用的方法。

    //在JavaScript中调用helloJS()。
    //你也可以使用匿名函数检索返回值。
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FScriptGate.CallScript(
        'helloJS()',
        procedure(const iResult: String)
        begin
          ShowMessage(iResult);
        end
      );
    end;
    //允许JavaScript调用的方法,JavaScript中的方法被称为HelloDelphi。
    procedure TForm1.HelloDelphi;
    begin
      ShowMessage('Hello, Delphi!');
    end;
    
    

      加载到WebBrowser1中的HTML如下所示。

    <html> 
      <header> 
        <script type="text/JavaScript"> 
          function helloJS() { alert("Hello, JavaScript!"); return "Hello !!"; }
        </script> 
      </head> 
    
      <body> 
        <br><br> 
        <a href="delphi:HelloDelphi()">Call Delphi procedure</a> 
      <body> 
    </html>;

     下面是作者写的完整的例子,演示了Delphi与JavaScript间如何互相调用以及在调用时,如何传递参数。

    unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.WebBrowser,
      SG.ScriptGate;
    
    type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Layout1: TLayout;
        Button1: TButton;
        Layout2: TLayout;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private var
        FScriptGate: TScriptGate;
      public
        procedure HelloDelphi(const iStr: String);
        procedure Add(const Msg: String; const A, B: Integer);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    const
      SampleHTML =
        '<html>' +
        '<header>' +
          '<script type="text/JavaScript">' +
            'function helloJS(msg, msg2) { alert(msg + msg2); return "Hello Delphi ! I am JavaScript !"; }' + // Call from Delphi
          '</script>' +
        '</head>' +
        '<body>' +
          '<br><br>' + // Call Delphi Method
          '<a href="YourOrgScheme:HelloDelphi(''call by JS'')">Call Delphi noparam procedure</a>' +
          '<br><br>' +
          '<a href="YourOrgScheme:Add(''Calc: 30 + 12 = '', 30, 12)">Call Delphi procedure</a>' +
        '<body>' +
        '</html>';
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      WebBrowser1.LoadFromStrings(SampleHTML, '/');
    
      // The method of the object specified by the first argument is
      // called from JavaScript.
      FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'YourOrgScheme');
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FScriptGate.CallScript(
        'helloJS("Hello JS ! ", "I am Delphi !")',
        procedure(const iResult: String)
        begin
          ShowMessage(iResult);
        end
      );
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      FScriptGate.Eval(
        'document.getElementsByTagName("html")[0].outerHTML',
        procedure(const iResult: String)
        begin
          ShowMessage(iResult);
        end
      );
    end;
    
    procedure TForm1.Add(const Msg: String; const A, B: Integer);
    begin
      ShowMessage(Msg + (A + B).ToString);
    end;
    
    procedure TForm1.HelloDelphi(const iStr: String);
    begin
      ShowMessage('Hello ! ' + iStr);
    end;
    
    end.
  • 相关阅读:
    常用分页插件
    sessionStorage二种存值取值的方法
    $(this).index()与$(obj).index(this)的区别
    每次移1px的无缝轮播图
    为什么全局变量在赋值之前调用会报错
    Number()、parseInt()和parseFloat()的区别
    JSON.parse()与JSON.stringify()
    HDU
    出现负数的01背包问题
    HDU
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/9249374.html
Copyright © 2020-2023  润新知