• 用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接口,后面的操作请随意。

      其次是填表,用过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代码不能生效。

      最后,最后先到这里,下一次再说关于弹出窗口、右键菜单、摸拟鼠标点击等内容。

    附:google论坛,delphi TChromium的问题讨论群组:http://groups.google.com/group/delphichromiumembedded

  • 相关阅读:
    监听刷新
    判断当前日期是否在[startDate, endDate]区间
    精确计算工具类,提供加减乘除的计算
    常用正则表达式
    高并发
    递归案例
    序列化和反序列化
    web安全
    复杂跨域之CorsFilter源码分析
    springMVC访问根路径问题
  • 原文地址:https://www.cnblogs.com/honeynm/p/3976393.html
Copyright © 2020-2023  润新知