【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析

第3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析
本文转自“吾乐吧软件站”,原文链接:http://www.wuleba.com/?p=23617
感兴趣的,可以加入:WebKit/Blink 内核浏览器开发 QQ交流群:244840771
开发语言为:.NET/C++ 方向
1、第一种方法,官方原生方法分析
1.1 实现过程:
(1)、定义一个DemoRenderProcessHandler,继承自CefRenderProcessHandler
(2)、重写DemoRenderProcessHandler里的OnWebKitInitialized ( )事件(注意:官方下载的代码,就有这个XXX\CefGlue.Demo\Renderer\DemoRenderProcessHandler.cs文件,不要自己去创建啊,因为涉及调用,为了省事,大家直接打开官方这个文件,进行修改即可)
(3)、定义一个ExampleAv8Handler,继承自CefV8Handler
(4)、在ExampleAv8Handler里的Execute ( )事件中,写你要执行的操作代码
(5)、在OnWebKitInitialized ( )事件里面new ExampleAv8Handler ( ),根据类的实际情况,人工手写JS脚本代码,通过官方提供的RegisterExtension(string extensionName, string javascriptCode, CefV8Handler handler)方法进行注册
(6)、写一个网页,去前台通过JS调用,例如网页那边调用:exampleA.myFunction ();
1.2 核心代码:
/// <summary>
/// DemoRenderProcessHandler.cs
/// </summary>
#region 声明常量变量
/// <summary>
/// 绑定测试处理器A
/// </summary>
private ExampleAv8Handler exampleA;
#endregion 声明常量变量
protected override void OnWebKitInitialized()
{
#region 原生方式注册 ExampleA
exampleA = new ExampleAv8Handler();
const string exampleAJavascriptCode = @”function exampleA() {}
if (!exampleA) exampleA = {};
(function() {
exampleA.__defineGetter__(‘myParam’,
function() {
native function GetMyParam();
return GetMyParam();
});
exampleA.__defineSetter__(‘myParam’,
function(arg0) {
native function SetMyParam(arg0);
SetMyParam(arg0);
});
exampleA.myFunction = function() {
native function MyFunction();
return MyFunction();
};
exampleA.getMyParam = function() {
native function GetMyParam();
return GetMyParam();
};
exampleA.setMyParam = function(arg0) {
native function SetMyParam(arg0);
SetMyParam(arg0);
};
})();”;
CefRuntime.RegisterExtension(“exampleAExtensionName”, exampleAJavascriptCode, exampleA);
#endregion 原生方式注册 ExampleA
base.OnWebKitInitialized();
}
/// <summary>
/// ExampleAv8Handler.cs
/// </summary>
public class ExampleAv8Handler : CefV8Handler
{
#region 声明常量变量
/// <summary>
/// 内容
/// </summary>
public string MyParam { get; set; }
#endregion 声明常量变量
#region 构造函数
/// <summary>
/// 默认构造函数
/// </summary>
public ExampleAv8Handler()
{
MyParam = “ExampleAv8Handlerler : flydoos@vip.qq.com”;
}
#endregion 构造函数
#region 事件
/// <summary>
/// 网页脚本与后台程序交互方法
/// 提示一:如果 returnValue = null; 则会导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// 提示二:还存在其他的可能,导致导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// </summary>
/// <param name=”name”>名称</param>
/// <param name=”obj”>对象</param>
/// <param name=”arguments”>参数</param>
/// <param name=”returnValue”>返回值</param>
/// <param name=”exception”>返回异常信息</param>
/// <returns></returns>
protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
{
string result = string.Empty;
switch (name)
{
case “MyFunction”:
MyFunction();
break;
case “GetMyParam”:
result = GetMyParam();
break;
case “SetMyParam”:
result = SetMyParam(arguments[0].GetStringValue());
break;
default:
MessageBox.Show(string.Format(“JS调用C# >> {0} >> {1} 返回值”, name, obj.GetType()), “系统提示”, MessageBoxButtons.OK);
break;
}
returnValue = CefV8Value.CreateString(result);
exception = null;
return true;
}
#endregion 事件
#region 方法
/// <summary>
/// 我的函数
/// </summary>
public void MyFunction()
{
MessageBox.Show(“ExampleAv8Handlerler : JS调用C# >> MyFunction >> 无 返回值”, “系统提示”, MessageBoxButtons.OK);
}
/// <summary>
/// 取值
/// </summary>
/// <returns></returns>
public string GetMyParam()
{
return MyParam;
}
/// <summary>
/// 赋值
/// </summary>
/// <param name=”value”>值</param>
/// <returns></returns>
public string SetMyParam(string value)
{
MyParam = value;
return MyParam;
}
#endregion 方法
}
1.3 评价总结:
弊端:
(1)、类对象必须继承CefV8Handler,所有操作方法,都必须写在该类Execute ( )里面
(2)、类对象的所有属性、方法,都需要在后台写出对应的JS脚本,进行注册绑定
(3)、如果想执行不同操作,就需要不断的写一大堆类对象,因为每个类只能做一件事
(4)、如果前台更新,或者类的属性、方法更新,将会产生繁杂的后续联动更新操作
from:http://www.wuleba.com/23617.html
【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析的更多相关文章
- 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析
作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第4篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- Xilium.CefGlue怎么使用Js调用C#方法
第1篇:.NET多种WebKit内核/Blink内核浏览器初步测评报告http://www.wuleba.com/?p=23590 第2篇:Xilium CefGlue 关于 CLR Object 与 ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- xilium CefGlue集成包
最近很苦B的要做一个C#的HTM5项目,build了一下xilium CefGlue包,提供下载地址,供那些无法下载的同学们使用. http://yun.baidu.com/s/1slEdNEt
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- Xilium.CefGlue利用XHR实现Js调用c#方法
防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...
随机推荐
- Oracle数据库中char, varchar, nvarchar的差异
1. char 固定长度,最长n个字符. 2. varchar 最大长度为n的可变字符串. (n为某一整数,不同数据库,最大长度n不同) char和varchar区别: ...
- 第三个Sprint冲刺第二天 最终篇
一.例会人员:李泳江,邵家文,周伟雄,谢洪跃 日期:6月21号 例会内容: 1.完成表格任务 编号 名称 时间 已用时间 是否完成 1 画出算法流程图 4小时 4小时 完成 2 界面设计 5小时 ...
- LeetCode Spiral Matrix II (技巧)
题意: 从1开始产生连续的n2个数字,以螺旋的方式填满一个n*n的数组. 思路: 由于是填满一个矩阵,那么只需要每次都填一圈即可.应该注意特殊情况. 迭代: class Solution { publ ...
- PostgreSQL高可用性、负载均衡、复制与集群方案介绍
目录[-] 一.高可用性.负载均衡.复制的几个方案比较: 二.多节点集群方案比较 9.3官方文档(中文):http://58.58.27.50:8079/doc/html/9.3.1_zh/high- ...
- dedecms list 实现noflag
转自:http://blog.sina.com.cn/s/blog_7e53dd2b0101l3kq.html 替换include下arc.listview.class.php即可 经测试可行 但在更 ...
- shell命令:给当前目录里一个文件压缩一份不包含.svn文件的zip包
filepath=$(cd ")"; pwd) packagePath="$filepath"/package zipPath="$filepath& ...
- UVa 11729 - Commando War
[题目翻译]: 题目分析:因为任务是可以并行的执行,所以直觉上是花费时间长的任务优先去部署.但是这到题目还给你交待任务的时间,所以容易让人想多了. 不管有没有交待任务的时间,对于任务x和y,只可能有两 ...
- Tomcat发布网站知识集锦
修改端口.修改默认发布目录.多域名绑定 一.修改发布端口号为80(Tomcat默认为8080) 打开配置文件(我的如下:E:\J2EEServer\Tomcat 6.0\conf\server.xml ...
- List-ApI及详解
1.API : add(Object o) remove(Object o) clear() indexOf(Object o) get(int i) size() iterator() isEmpt ...
- C++ Primer:第七章:类
定义一个类: class Myclass{ int data_i; string data_str; public: int getdata_i() const { return data_i; } ...