本站创建于2006年,博主为Delphi老码农,暗黑忠实粉丝,主要用于学习经验分享
    • delphi chrome cef3 控件学习笔记 (二)

    • 用Tchromium替换webbrowser

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

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

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

        --> 

        -->

        -->                   //后面三个是自动生成的唯一名称

      获取指定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执行,就调用哪一层

      更神奇的是,还可以通过以下方法加载属于自己的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是区分大小写的!~

      标签: cef

    • 当前暂无评论 »

      • 发表评论: ( 注意:为了防止广告评论,本站链接已经启用nofollow)
      •   您的名字
      •   E-mail
      •   您的网址(选填)

Powered by Typecho)))   ICP:蜀ICP备05009250号