作者: 牛A与牛C之间 时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章

主页 » 技术文章 » 第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 交互类库封装报告:官方原生方法分析的更多相关文章

  1. 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析

    作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  2. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  3. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  4. 【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第4篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  5. Xilium.CefGlue怎么使用Js调用C#方法

    第1篇:.NET多种WebKit内核/Blink内核浏览器初步测评报告http://www.wuleba.com/?p=23590 第2篇:Xilium CefGlue 关于 CLR Object 与 ...

  6. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  7. xilium CefGlue集成包

    最近很苦B的要做一个C#的HTM5项目,build了一下xilium CefGlue包,提供下载地址,供那些无法下载的同学们使用. http://yun.baidu.com/s/1slEdNEt

  8. Java总结篇系列:java.lang.Object

    从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...

  9. Xilium.CefGlue利用XHR实现Js调用c#方法

    防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...

随机推荐

  1. JQuery基础DOM操作

    DOM创建节点及节点属性 通过JavaScript可以很方便的获取DOM节点,从而进行一系列的DOM操作.但实际上一般开发者都习惯性的先定义好HTML结构,但这样就非常不灵活了. 试想下这样的情况:如 ...

  2. IAP 程序内购

    最近用到IAP内置购买,阅读官方文档,在网上找了些资料,在这里作下整理,以便日后查找和修改,主要流程方向确定,文档和相关转载内容截图不一一指出,google一堆. 1.查找官方文档,两张目录截图,对主 ...

  3. iOS数据持久化

    在iOS中,实现数据持久化一般分为4大种: 1.属性列表 2.对象归档 3.SQLite 4.Core Data 一.属性列表 NSUserDefaults类的使用和NSKeyedArchiver有很 ...

  4. eclipse如何连接oracle 11g数据库

    1.首先先建立一个项目DB,右键点击DB,选择Build Path-->Configure Build Path进入 通过Add External JARs..选择D:\orcl\app\hr\ ...

  5. markdown to html

    /************************************************************************* * markdown to html * 说明: ...

  6. yii弹出层

    Yii弹出层,包装了JQuery的JDialog,使用很方便.Yii组件功能太强大,强大到无法自拔 $this->beginWidget('zii.widgets.jui.CJuiDialog' ...

  7. Day03_JAVA语言基础第三天

    1.位运算符 1.面试题(掌握) ^:一个数据对同一个数据^两次,结果还是数据本身 举例:a ^ b ^ b = a  2.注意 知道结论,面试题,以后就完全不用看了 2.逻辑运算符(掌握)     ...

  8. java 代码分析工具——JDepend

    最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 百科上的介绍,我竟然都看懂了,那就不找其他地方的资料了. JDepend 一个开放源代码的可以用来评价 ...

  9. hdu 3666 Making the Grade

    题目大意 给出了一列数,要求通过修改某些值,使得最终这列数变成有序的序列,非增或者非减的,求最小的修改量. 分析 首先我们会发现,最终修改后,或者和前一个数字一样,或者和后一个数字一样,这样才能修改量 ...

  10. ZOJ 1216 Deck

    原题链接 题目大意:1/2+1/4+1/6+…1/n 解法:直接累加即可. 参考代码: #include<stdio.h> int main(){ printf("# Cards ...