从Delphi程序调用Javascript函数

从Delphi程序调用Javascript函数,javascript,delphi,Javascript,Delphi,我有一个问题,我找不到一个明确的答案 所以我有以下JavaScript代码: var asp={ 字母表:“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789+/=”, 查找:null, ie:/MSIE/.test(navigator.userAgent),//检查浏览器客户端 ieo:/MSIE[67]/.test(navigator.userAgent),//检查浏览器客户端 编码:功能{ var buffer=asp.t

我有一个问题,我找不到一个明确的答案

所以我有以下JavaScript代码:

var asp={
字母表:“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789+/=”,
查找:null,
ie:/MSIE/.test(navigator.userAgent),//检查浏览器客户端
ieo:/MSIE[67]/.test(navigator.userAgent),//检查浏览器客户端
编码:功能{
var buffer=asp.toUtf8(s),
位置=-1,
len=缓冲区长度,
nan0,nan1,nan2,enc=[,];
如果(asp.ie){
var结果=[];
而(++位置>2;
enc[1]=((nan0&3)>4);
如果(isNaN(nan1))enc[2]=enc[3]=64;
否则{
nan2=缓冲器[++位置];
enc[2]=((nan1&15)>6);
enc[3]=(isNaN(nan2))?64:nan2和63
}
结果.push(asp.alphabet.charAt(enc[0])、asp.alphabet.charAt(enc[1])、asp.alphabet.charAt(enc[2])、asp.alphabet.charAt(enc[3]))
}
返回结果。连接(“”)
}否则{
var结果=“”;
而(++位置>2;
enc[1]=((nan0&3)>4);
如果(isNaN(nan1))enc[2]=enc[3]=64;
否则{
nan2=缓冲器[++位置];
enc[2]=((nan1&15)>6);
enc[3]=(isNaN(nan2))?64:nan2和63
}
结果+=asp.alphabet[enc[0]]+asp.alphabet[enc[1]]+asp.alphabet[enc[2]]+asp.alphabet[enc[3]]
}
返回结果
}
},
换行:函数{
如果(s.length%4)抛出新错误(“InvalidCharacterError:'asp.wrap'失败:要wrapd的字符串编码不正确”);
var buffer=asp.fromUtf8(s),
位置=0,
len=缓冲区长度;
如果(asp.ieo){
var结果=[];
while(位置191&&buffer[position]<224)result.push(String.fromCharCode(((buffer[position++]&31)>6)和63)| 128,(chr&63)| 128)
}
返回缓冲区
},
fromUtf8:功能{
变量位置=-1,
len,buffer=[],
enc=[,];
如果(!asp.lookup){
len=asp.alphabet.length;
asp.lookup={};
而(++position4));
enc[2]=asp.lookup[s.charAt(++位置)];
如果(enc[2]==64)中断;
buffer.push((enc[1]&15)>2));
enc[3]=asp.lookup[s.charAt(++位置)];
如果(enc[3]==64)中断;

buffer.push(((enc[2]&3)该代码预期将在浏览器环境中运行,因此要直接使用它,您必须在浏览器中运行它,可能是无头浏览器。尽管可以删除浏览器的特定部分,但这似乎主要是解决Internet Explorer问题的解决方法


与其尝试直接使用它(这将非常复杂),我只想将其转换为Delphi。

要运行JavaScript函数,必须使用WebBrowser组件(如TwebbBrowser)。但是,默认情况下,TWebBrowser组件与最旧版本的Internet Explorer兼容。在第一步中,您必须与最新版本兼容。为此,您必须使用以下代码(适用于IE10):

在第二步中,在表单上放置TWebBrowser组件

在下一步中,在应用程序中添加此功能:

procedure ExecuteJavaScript(document:IHTMLDocument2; Code: string);
var
  Window:IHTMLWindow2;
begin
  if not Assigned(Document) then Exit;
  Window:=Document.parentWindow;
  if not Assigned(Window) then Exit;
  try
    Window.execScript(Code,'JavaScript');
  except
    on E:Exception do raise Exception.Create('Javascript error '+E.Message+' in: '#13#10+Code);
  end;
end;
通过这个函数,您可以运行javascript函数

Example1(运行没有返回值的函数):

ExecuteJavaScript((WebBrowser1.Document as IHTMLDocument2), 'JsFunctionName();');
Example2(javascript代码返回值): 如果JS代码返回值,请将此函数添加到delphi程序:

function GetElementIdValue(WebBrowser:TWebBrowser; TagName,TagId,TagAttrib:String):String;
var
  Document: IHTMLDocument2;
  Body: IHTMLElement2;
  Tags: IHTMLElementCollection;
  Tag: IHTMLElement;
  I: Integer;
begin
  Result:='';
  if not Supports(WebBrowser.Document, IHTMLDocument2, Document) then
    raise Exception.Create('Invalid HTML document');
  if not Supports(Document.body, IHTMLElement2, Body) then
    raise Exception.Create('Can''t find <body> element');
  Tags := Body.getElementsByTagName(UpperCase(TagName));
  for I := 0 to Pred(Tags.length) do begin
    Tag:=Tags.item(I,EmptyParam) as IHTMLElement;
    if Tag.id=TagId then Result:=Tag.getAttribute(TagAttrib,0);
  end;
end;
本例中的JavaScript代码为:

function DoEval(expr){
 // eval for delphi!
 document.getElementById('result').value=eval(expr);
}
对于使用此示例,您的使用必须如下所示:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, ExtCtrls, {REQUIRED UNITS} SHDocVw, MSHTML,
  ComCtrls {/REQUIRED UNITS};

我将代码移植到Delphi。从长远来看,这将产生最干净的代码。不难理解它的作用。你只需要在两种语言的按位操作之间建立一个映射。加密???!!如果我仔细看看,它只是一个普通的base64编码器!(或者我错了?)@确实是StijnSanders——它似乎来自某个地方……例如:或者这个(加上一个额外的UTF8Encode)我考虑过,但是我不太熟悉javascript(从来都不喜欢这种语言)但是我的项目现在迫使我处理这个脚本:/,因此考虑到项目的时间限制,将代码移植到delphi并不可行(我必须在周一之前完成)@KazutoKirigaya:我敢打赌,你把它翻译成Delphi的速度比你让Delphi成功地称它为“原样”的速度要快得多。我们讨论的是3-4打代码,星期一似乎不是一个很难满足的最后期限。@KazutoKirigaya这些确实是你的问题。TJ只是告诉你最好的选择是什么。如果你不能选择,那真的就是我意识到了这一点,我非常重视他的意见,我会按照他的建议去做,但我想继续讨论,以防有人有更好的解决方案..嗯,
btnIE10EmulatorClick
函数有很多问题
function DoEval(expr){
 // eval for delphi!
 document.getElementById('result').value=eval(expr);
}
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, ExtCtrls, {REQUIRED UNITS} SHDocVw, MSHTML,
  ComCtrls {/REQUIRED UNITS};