在Delphi中高效执行JS代码

摘要:
因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用。后面发现多次使用后delphi自带的HttpEncode会报OutofMemory.以上可能是我使用的不好,但没有找到解决办法。

因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用。

后面发现多次使用后delphi自带的HttpEncode会报Out of Memory.

以上可能是我使用的不好,但没有找到解决办法。

后面想到直接采用运行JavaScript代码,找到了”万一的 Delphi 博客

在 Delphi 中调用 JavaScript(2) - 万一 - 博客园 (cnblogs.com)

{此函数需要 ComObj 单元的支持}
{参数 JsCode 是要执行的 Js 代码; 参数 JsVar 是要返回的变量}
function RunJs(const JsCode, JsVar: string): string;
varscript: OleVariant;
begin
  tryscript := CreateOleObject('ScriptControl');
    script.Language := 'JavaScript';
    script.ExecuteStatement(JsCode);
    Result :=script.Eval(JsVar);
  exceptResult := '';
  end;
end;

万一老师的博客,内容简洁,附完全代码(pas和dfm),赞一个!

这个函数非常好用,但有一个问题,每次执行的时间较长。

经过研究,是创建时间较长。 所以可以分为2个函数,创建和执行。

开始时一次创建,需要时多次执行

完全代码如下:

unitUnit1;

interface

usesComObj,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

typeTForm1 = class(TForm)
    Button1: TButton;
    procedureButton1Click(Sender: TObject);
  private
    {Private declarations }
  public
    {Public declarations }
  end;

varForm1: TForm1;
  script: OleVariant;

implementation

{$R *.dfm}
function RunJs(const JsCode, JsVar: string): string;
begin
  tryscript.ExecuteStatement(JsCode);
    Result :=script.Eval(JsVar);
  exceptResult := '';
  end;
end;

procedurePrepareJs;
begin
  tryscript := CreateOleObject('ScriptControl');
    script.Language := 'JavaScript';
  except
  end;
end;


procedureTForm1.Button1Click(Sender: TObject);
varI,T : Integer;
    S   : String;
beginT   :=GetTickCount;
    PrepareJs;
    for I:=0 to 9999 do beginS   := RunJS('var a=encodeURIComponent("abc中文件123")','a')
    end;
    ShowMessage((GetTickCount-T).ToString+'- '+S);
end;

end.

经测试,执行10000次仅需要688毫秒

免责声明:文章转载自《在Delphi中高效执行JS代码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇golang 设置web请求状态码MOS管驱动电路,看这里就啥都懂了下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF 获取程序路径的一些方法,根据程序路径获取程序集信息

一、WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirectory; 示例结果:F:\WPF实例\bin\Debug\示例说明:取得Debug目录并且带斜杠 //获取应用程序基目录的名称 string str_2...

svg DOM的一些js操作

这是第一个实例,其中讲了如何新建svg,添加元素,保存svgdocument,查看svg. 下面将附上常用一些元素的添加方法:(为js的,但基本上跟java中操作一样,就是类名有点细微差别) Circle var svgns = "http://www.w3.org/2000/svg";function makeShape(evt) { if ( wi...

数据基本类型以及相关举例

数据基本类型: 整型:字节型byte 短整型short  整型int  浮点类型:长整形long  浮点型  fioat   双精度性double  字符型:char  布尔型:boolean   引用类型( reference): 类class   接口interface   数据  array     循环:for   while      do wh...

JS打印指定区域内容

  很多时候,我们在做系统的时候要做打印功能,打印在js中其实很简单,不过这个很简单的代码并不能满足我们的特定需求,比如我们需要打印的表单在很多文字的中间,或者文字中包含一些广告或者图片什么的,这就很难用:window.print();这时,我们就要分区域的打印,将需要打印的内容提取出来让打印机知道,而不是一股脑的全部打印!下面是两种实现的方法:  第一种...

javascript 获取滚动条高度+常用js页面宽度与高度[转]

/********************* 取窗口滚动条高度******************/function getScrollTop(){var scrollTop=0;if(document.documentElement&&document.documentElement.scrollTop){scrollTop=docume...

Android9.0 Settings 修改踩坑记录

问题现象 上图展示的很清楚,当系统语言为中文时,PreferenceScreen 中的折叠项 summary 描述重复显示的 bug,系统语言为英文时正常。 修改历程 先搜索 当前显示了 字符串,还真找到了 prebuiltssdkcurrentsupportv7preference esvalues-zh-rCNvalues-zh-rCN.xml &l...