从Delphi程序调用Javascript函数
我有一个问题,我找不到一个明确的答案 所以我有以下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
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};