• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi中ChromeChromium、Cef3学习笔记(二)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 
用Tchromium替换webbrowser

  用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。

  要把用习惯的EmbeddedWB换成完全不一样的TChromium,有点挑战,特别是在资料不多,英语没过三级的情况下。未来趋势是这样,只有慢慢啃了。

  首先,想到的是跨域,如果不能跨域,就没办法替代手上的成品。TChromium的跨域比想像中的简单,直接通过chrm.Browser.GetFrameNames(list);//list:tstringList;取得各个IFrame/Frame的名称(所谓名称不是指name属性,只是一个标识,在有name时,返回name,没有name时,ID 也行,都没有时,自动生成一个唯一名称),如:

  ff                                                                       //这个是一个框架的ID

  <!--framePath //ff/<!--frame0-->--> 

  <!--framePath //ff/<!--frame1-->-->

  <!--framePath //ff/<!--frame2-->-->                   //后面三个是自动生成的唯一名称

获取指定Frame时,通过chrm1.Browser.Frame['frame 的名称'],取得ICefFrame接口,后面的操作请随意。

 

常用方法:

获取主框架 chrm1.browser.MainFrame

获取源代码 s := chrm1.browser.MainFrame.Source;

  其次是填表,用过google浏览器的都知道,其填表功能实在强大,在webbrowser时代,一般都是获取表单元素的各种接口,然后设置其value、checked等属性,而在TChromium中,一切皆js,把想做的事都让js去执行吧,所以,用TChromium,js功力深厚的会轻松很多了。比如:

strTemp := 'document.forms[0].inmembername.value="User_Name";'; 
  JavaExec(strTemp); 
  strTemp := 'document.forms[0].inpassword.value="Password";'; 
  JavaExec(strTemp); 
  strTemp := 'document.forms[0].submit.click();'; 
  chrm.browser.Frame['ff'].ExecuteJavaScript(str,'about:blank',0);; //想在哪一层frame执行,就调用哪一层

直接在某一个frame下执行JS

例如:

<frame >

 

网页源码如上: 我要在是frame id="IndexFrame下给红色的Input 赋值。并不需要遍历Ifame 直接  直接找到

var inputs = framesEl.contentWindow.document.getElementsByName('input');
inputs = inputs && inputs.length > 0 ?inputs:framesEl.contentDocument.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
input = inputs[i];
if(input){
var point = input.getAttribute('data-fx');
var css = input.getAttribute('class');
if(point == index && css=='input'){
break;。。。。。。

 

 

 

更神奇的是,还可以通过以下方法加载属于自己的jquery到浏览器中:

procedure TForm3.chrm1LoadEnd(Sender: TCustomChromium;
  const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer;
  out Result: TCefRetval);
var
  str:string;
begin
   str:='var oHead = document.getElementsByTagName(''HEAD'').item(0);'#13#10+
      'var oScript = document.createElement( "script" );'#13#10+
      'oScript.language = "javascript";'#13#10+
      'oScript.type = "text/javascript";'#13#10+
      'oScript.id = "sid";'#13#10+
      'oScript.defer = true;'#13#10+
      'oScript.src = "jquery.js";'#13#10+
      'oHead.appendChild( oScript );'#13#10+
      'alert("8")' ;
   Frame.ExecuteJavaScript(str,'about:blank',0);
end;

直接连接本地的js!!!这段代码最后写在LoadEnd中,每加载完成一个frame,就让这个frame加载自己的jquery,如果在需要使用的时候再去加载jquery,jquery加载是需要时间的,可能会导致紧接着的js代码不能生效。

 

注意事项:Delphi执行JS的代码,必须注意大小写,特别是自己写的JS函数,因为JS是区分大小写的!~

下一篇主要讲解DELPHI与JS交互的更深层次方面。

  用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。

  要把用习惯的EmbeddedWB换成完全不一样的TChromium,有点挑战,特别是在资料不多,英语没过三级的情况下。未来趋势是这样,只有慢慢啃了。

  首先,想到的是跨域,如果不能跨域,就没办法替代手上的成品。TChromium的跨域比想像中的简单,直接通过chrm.Browser.GetFrameNames(list);//list:tstringList;取得各个IFrame/Frame的名称(所谓名称不是指name属性,只是一个标识,在有name时,返回name,没有name时,ID 也行,都没有时,自动生成一个唯一名称),如:

  ff                                                                       //这个是一个框架的ID

  <!--framePath //ff/<!--frame0-->--> 

  <!--framePath //ff/<!--frame1-->-->

  <!--framePath //ff/<!--frame2-->-->                   //后面三个是自动生成的唯一名称

获取指定Frame时,通过chrm1.Browser.Frame['frame 的名称'],取得ICefFrame接口,后面的操作请随意。

 

常用方法:

获取主框架 chrm1.browser.MainFrame

获取源代码 s := chrm1.browser.MainFrame.Source;

  其次是填表,用过google浏览器的都知道,其填表功能实在强大,在webbrowser时代,一般都是获取表单元素的各种接口,然后设置其value、checked等属性,而在TChromium中,一切皆js,把想做的事都让js去执行吧,所以,用TChromium,js功力深厚的会轻松很多了。比如:

strTemp := 'document.forms[0].inmembername.value="User_Name";'; 
  JavaExec(strTemp); 
  strTemp := 'document.forms[0].inpassword.value="Password";'; 
  JavaExec(strTemp); 
  strTemp := 'document.forms[0].submit.click();'; 
  chrm.browser.Frame['ff'].ExecuteJavaScript(str,'about:blank',0);; //想在哪一层frame执行,就调用哪一层

直接在某一个frame下执行JS

例如:

<frame >

 

网页源码如上: 我要在是frame id="IndexFrame下给红色的Input 赋值。并不需要遍历Ifame 直接  直接找到

var inputs = framesEl.contentWindow.document.getElementsByName('input');
inputs = inputs && inputs.length > 0 ?inputs:framesEl.contentDocument.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
input = inputs[i];
if(input){
var point = input.getAttribute('data-fx');
var css = input.getAttribute('class');
if(point == index && css=='input'){
break;。。。。。。

 

 

 

更神奇的是,还可以通过以下方法加载属于自己的jquery到浏览器中:

procedure TForm3.chrm1LoadEnd(Sender: TCustomChromium;
  const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer;
  out Result: TCefRetval);
var
  str:string;
begin
   str:='var oHead = document.getElementsByTagName(''HEAD'').item(0);'#13#10+
      'var oScript = document.createElement( "script" );'#13#10+
      'oScript.language = "javascript";'#13#10+
      'oScript.type = "text/javascript";'#13#10+
      'oScript.id = "sid";'#13#10+
      'oScript.defer = true;'#13#10+
      'oScript.src = "jquery.js";'#13#10+
      'oHead.appendChild( oScript );'#13#10+
      'alert("8")' ;
   Frame.ExecuteJavaScript(str,'about:blank',0);
end;

直接连接本地的js!!!这段代码最后写在LoadEnd中,每加载完成一个frame,就让这个frame加载自己的jquery,如果在需要使用的时候再去加载jquery,jquery加载是需要时间的,可能会导致紧接着的js代码不能生效。

 

注意事项:Delphi执行JS的代码,必须注意大小写,特别是自己写的JS函数,因为JS是区分大小写的!~

下一篇主要讲解DELPHI与JS交互的更深层次方面。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Linux下安装matlab发布时间:2022-07-18
下一篇:
MATLAB算术运算符和常用函数 - chloe_zhou发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap