您的位置:首页 > 编程语言 > Delphi

Delphi中Chrome Chromium、Cef3学习笔记(三)

2015-06-25 17:37 411 查看
Delphi与JS的交互问题:

一、执行简单的JS

上一篇已经讲过:

chrm1.browser.MainFrame.ExecuteJavaScript('alert("abc");','about:blank',0);

chrm1.browser.MainFrame.ExecuteJavaScript('function aaa(){alert("abc");}aaa();','about:blank',0);

二、注入自定义的JS

首先必须在网页加载完成之后,才可以执行,不能为空页面!

str_js := 'var oScript = document.createElement( "script" );oScript.id = "sid";alert(oScript.id);';

chrm1.browser.MainFrame.ExecuteJavaScript(str_js,'about:blank',0);

三、delphi与JS交互(通过ceflib实现)

Cef3的Demo里面,有一个cefclient的例子,可以看下,关键代码:

TExtension = class(TCefv8HandlerOwn)

private

FTestParam: ustring;

protected

function Execute(const name: ustring; const obj: ICefv8Value;

const arguments: TCefv8ValueArray; var retval: ICefv8Value;

var exception: ustring): Boolean; override; //重写Execute事件

end;

//通过不同的name,执行不同的动作

function TExtension.Execute(const name: ustring; const obj: ICefv8Value;

const arguments: TCefv8ValueArray; var retval: ICefv8Value;

var exception: ustring): Boolean;

begin

if(name = 'SetTestParam') then

begin

// Handle the SetTestParam native function by saving the string argument

// into the local member.

if (Length(arguments) <> 1) or (not arguments[0].IsString) then

begin

Result := false;

Exit;

end;

FTestParam := arguments[0].GetStringValue; //多个参数arguments[i].GetStringValue 依次类推

Result := true;

end

else if(name = 'GetTestParam') then

begin

// Handle the GetTestParam native function by returning the local member

// value.

retval := TCefv8ValueRef.CreateString(Ftestparam);

Result := true;

end

else if (name = 'GetTestObject') then

begin

// Handle the GetTestObject native function by creating and returning a

// new V8 object.

retval := TCefv8ValueRef.CreateObject(nil);

// Add a string parameter to the new V8 object.

retval.SetValueByKey('param', TCefv8ValueRef.CreateString(

'Retrieving a parameter on a native object succeeded.'));

// Add a function to the new V8 object.

retval.SetValueByKey('GetMessage',

TCefv8ValueRef.CreateFunction('GetMessage', Self));

Result := true;

end

else if(name = 'GetMessage') then

begin

// Handle the GetMessage object function by returning a string.

retval := TCefv8ValueRef.CreateString(

'Calling a function on a native object succeeded.');

Result := true;

end else

Result := false;

end;

{ 注册JS扩展 }

procedure RegisterExtension;

var

Code: string;

begin

Code :=

'var cef;if(!cef)cef={};if(!cef.taobao)cef.taobao={};(function(){cef.taobao.test_object=function(){native function GetTestObject();return GetTestObject();};})();';

if Code <> '' then

try

CefRegisterExtension('example/v8',Code,TExtension.Create as ICefv8Handler);

except

end;

end;

在FormCreate中注册类:

RegisterExtension;

调用实例:

chrm1.browser.MainFrame.ExecuteJavaScript('alert("abc");','about:blank',0);

str_temp := 'function aaa(){var CefObj = new cef.taobao.test_object;'+ //先new一个实例对象

'CefObj.SetTestParam("abc");var b=CefObj.GetTestParam();alert(b);'+ //设置、获取、输出参数

'}aaa();';

chrm1.Browser.MainFrame.ExecuteJavaScript(str_temp,'about:blank',0);

如果要实现多个参数,可以定义个数组替代FTestParam
private

FTestParam : ustring;

ArrayParam : array of ustring; //多个参数

关键代码:
if(name = 'SetTestParam') then

begin

// **************原来一个参数的情况**********

// if (Length(arguments) <> 1) or (not arguments[0].IsString) then

// begin

// Result := false;

// Exit;

// end;

// FTestParam := arguments[0].GetStringValue;

// **************原来一个参数的情况**********

SetLength(ArrayParam,Length(arguments));

for i := 0 to Length(arguments) - 1 do

begin

ArrayParam[i] := arguments[i].GetStringValue;

if s='' then

s := ArrayParam[i]

else

s := s+','+ArrayParam[i];

end;

FTestParam := s;

end

else if(name = 'GetTestParam') then

begin

// **************原来一个参数的情况**********

// retval := TCefv8ValueRef.CreateString(FTestParam);

// **************原来一个参数的情况**********

for i := 0 to Length(ArrayParam) - 1 do

begin

if s='' then

s := ArrayParam[i]

else

s := s+','+ArrayParam[i];

end;

retval := TCefv8ValueRef.CreateString(FTestParam);

end;

这样调用GetTestParam返回的还是一个字符串,多个参数用逗号隔开了而已,可以对其再进行改写即可;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: