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;
调用实例:
\'CefObj.SetTestParam("abc");var b=CefObj.GetTestParam();alert(b);\'+ //设置、获取、输出参数
\'}aaa();\';
chrm1.Browser.MainFrame.ExecuteJavaScript(str_temp,\'about:blank\',0);
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;
请发表评论