用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
用Tchromium替换webbrowser的更多相关文章
- 用Tchromium替代webbrowser提交网页表单有关问题
用Tchromium替代webbrowser提交网页表单有关问题 提交表单时,使用js脚本,然后用 chrm.browser.Frame['ff'].ExecuteJavaScript 提交就可以 ...
- delphi WebBrowser的使用方法详解(五)-难点释疑
网页代码:<SELECT id=fy onchange=TouchRefresh(1) name=fy> <OPTION selected value=15>每頁顯示15筆&l ...
- Delphi中Chrome Chromium、Cef3学习笔记(二)
原文 http://blog.csdn.net/xtfnpgy/article/details/46635739 用Tchromium替换webbrowser 用惯了EmbeddedWB,不想 ...
- 转)delphi chrome cef3 控件学习笔记 (二)
(转)delphi chrome cef3 控件学习笔记 (二) https://blog.csdn.net/risesoft2012/article/details/51260832 原创 2016 ...
- HtmlAgilityPack相关网页
//多线程 http://www.cnblogs.com/jiangming/archive/2012/09/11/MultiThreadCallWebbrowser.html //替换Webbrow ...
- .NET 6上的WebView2体验
上次说为了不想在web端登录博客园,我想着还是继续使用MarkWord编写博客,不过在使用的过程中,如果markdown文件的目录中有中文的话,Markdown预览就不能够显示粘贴的图片了,原因是之前 ...
- C#将WebBowser控件替换为Chrome内核
摘要 由于最近要做一个浏览器式的软件,其中有不少地方需要使用到jQuery和BootStrap,但是在C#中,默认的WebBrowser控件默认使用的是IE的core,而低版本的IE在JS加载上总是容 ...
- 解决 WPF AllowsTransparency = true 和 Webbrowser 等控件显示冲突
代码: public class FormsWebBrowser { Window _owner; FrameworkElement _placementTarget; Form _form; AxA ...
- delphi中webbrowser的用法
WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForw ...
随机推荐
- ActiveMQ 无法启动 提示端口被占用 解决方案
http://bob-zhangyong.blog.163.com/blog/static/17610982012729113326153/ ————————————————————————————— ...
- Tutorial : How to Create a Border Glow Effect in JavaFX
http://blog.idrsolutions.com/2014/02/tutorial-create-border-glow-effect-javafx/ ———————————————————— ...
- nginx 403 forbidden 二种原因
nginx 403 forbidden 二种原因 引起nginx 403 forbidden有二种原因,一是缺少索引文件,二权限问题.今天又遇到 了,顺便总结一下. 1,缺少index.html或者i ...
- 常见sql 写法总结
关于如何获取1对多数据中最大条数据的写法 例子: LEFT JOIN ( SELECT * FROM table AS n1 WHERE n1.ID IN ( SELECT MAX(id) FROM ...
- 什么是ORM,以及在php上的使用?
ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射.为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却 ...
- Django升级到1.10,MEDIA_ROOT发生TypeError错误
Getting error: “TypeError: view must be a callable or a list/tuple in the case of include().” when r ...
- (转)javascript日期格式化扩展
转自:http://blog.csdn.net/vbangle/article/details/5643091 javascript Date format(js日期格式化) 方法一:这个很不错, ...
- java调用oracle函数
/** * 调用函数取得数据表的ID值 * @param tableName 表名 * @return * @throws SQLException */ public String callFun( ...
- Idea定位打开文件在左边工程中的文件路径
勾选掉Autoscoll from Source
- hdu 4055(经典问题)
总是不能正确的将一个大问题变成子问题,而且又找不到状态转移方程. 直接导致这题想了5个小时最后还是无果... 谨记! Number String Time Limit: 10000/5000 MS ( ...