/*
* CEF JS调用C#组装类
*
* 使用方法(CefGlue为例):
* public class BrowserRenderProcessHandler : CefRenderProcessHandler
{
* //自定义Handler
private TestBrowserHandler _testHandler = null;
*
* protected override void OnWebKitInitialized()
* {
* _testHandler = new TestBrowserHandler();
* CefRuntime.RegisterExtension(_testHandler.GetType().Name, _testHandler.Javascript.Create(), _testHandler);
* }
* }
*
* /// <summary>
/// 测试Handler
/// </summary>
public class TestBrowserHandler : CefV8Handler
{
public GenerateJavascriptFull Javascript = null;
*
* public TestBrowserHandler()
{
Javascript = new GenerateJavascriptFull("plugins", "test");
* // getHello的参数数量,可进一步封装。表示接受一个参数
Javascript.AddMethod("gethello", "arg0");
* // getHello的参数数量,可进一步封装。表示接受二个参数
Javascript.AddMethod("sethello", "arg0","arg1");
* //表示无参
* Javascript.AddMethod("sethello");
Javascript.AddGetProperty("hello", "gethello");
Javascript.AddSetProperty("hello", "sethello", "arg0");
Javascript.AddMethod("start", "arg0");
Javascript.AddMethod("stop");
*
* //这里表示浏览器JS增加了: window.plugins.test 对象
* // window.plugins.test.gethello()
* // window.plugins.test.sethello("123")
* //断点在 Execute(**)中
}
*
* protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
{
try
{
returnValue = CefV8Value.CreateNull();
switch (name)
{
case "gethello":
//returnValue = CefV8Value.CreateString(GetHello());
if (arguments.Length == 1 && arguments[0].IsFunction)
{
CefV8Value[] args = new CefV8Value[1];
args[0] = CefV8Value.CreateString(GetHello());
returnValue = arguments[0].ExecuteFunction(null, args);
}
break;
case "sethello":
returnValue = CefV8Value.CreateBool(SetHello(arguments[0].GetStringValue()));
break; case "start":
if (arguments.Length == 1 && arguments[0].IsFunction)
{ CefV8Context context = CefV8Context.GetCurrentContext();
//这里定义异步调用方式
new Thread(new ThreadStart(delegate()
{
while (isStart)
{
System.Threading.Thread.Sleep(1000);
string timer = DateTime.Now.ToString();
* //TestTimerTask继承CefTask
CefRuntime.PostTask(CefThreadId.Renderer, new TestTimerTask(context as CefV8Context, arguments[0], new object[] { timer }));
}
})).Start();
returnValue = CefV8Value.CreateBool(true);
}
break;
case "stop":
isStart = false;
returnValue = CefV8Value.CreateBool(true);
break;
} exception = null;
return true;
}
catch (Exception e)
{
returnValue = null;
exception = e.Message;
return false;
}
}
* }
*
*
*
*
*
*/ using System;
using System.Collections.Generic;
using System.Text; namespace G.DeskCommon
{
/// <summary>
/// 组装JS
/// </summary>
public class GenerateJavascriptFull
{
string _extensionName = string.Empty;
string _functionName = string.Empty;
Dictionary<string, string[]> _methodName = new Dictionary<string, string[]>(); //
Dictionary<string, string> _getterPropertyName = new Dictionary<string, string>(); // 保存setter 名称 和参数。 与 _setterPropertyArgs 成对出现。
Dictionary<string, string> _setterPropertyName = new Dictionary<string, string>();
Dictionary<string, string[]> _setterPropertyArgs = new Dictionary<string, string[]>(); //自定义javascript代码
List<string> _customJavascript = new List<string>(); /// <summary>
///
/// </summary>
/// <param name="extensionName">
/// 插件方法作用域
/// e.g: window.plugin.test
/// 其中 plugin 为作用域. 如不设置,添加的js方法在window下.
/// </param>
/// <param name="functionName">
///
/// </param>
public GenerateJavascriptFull(string extensionName, string functionName)
{
_extensionName = extensionName;
_functionName = functionName;
} /// <summary>
/// 增加方法
/// </summary>
/// <param name="methodName">方法名称</param>
/// <param name="args">参数名:arg0,arg1,...arg20 (固定写死)</param>
public void AddMethod(string methodName, params string[] args)
{
//检测是否存在改方法
if (_methodName.ContainsKey(methodName))
return;
_methodName.Add(methodName, args);
} /// <summary>
/// 增加Getter属性
/// </summary>
/// <param name="propertyName">属性名称</param>
/// <param name="executeName">执行名称,CEF handler中execute的Name参数同名</param>
public void AddGetProperty(string propertyName, string executeName)
{
if (_getterPropertyName.ContainsKey(propertyName))
return; _getterPropertyName.Add(propertyName, executeName);
} /// <summary>
/// 增加Setter属性
/// </summary>
/// <param name="propertyName">属性名称</param>
/// <param name="executeName">执行名称,CEF handler中execute的Name参数同名</param>
/// <param name="args">参数名:arg0,arg1,...arg20 (固定写死)</param>
public void AddSetProperty(string propertyName, string executeName, params string[] args)
{
if (_setterPropertyName.ContainsKey(propertyName) || _setterPropertyArgs.ContainsKey(propertyName))
return; _setterPropertyName.Add(propertyName, executeName);
_setterPropertyArgs.Add(propertyName, args);
} /// <summary>
/// 增加自定义的javascript代码。
/// </summary>
/// <param name="javascriptCode">注意:functionName一定要大写。
/// 例如: TEST.__defineSetter__('hello', function(b) {
/// native function sethello();sethello(b);});</param>
public void AddCustomJavascript(string javascriptCode)
{
_customJavascript.Add(javascriptCode);
} /// <summary>
/// 组装本地JS的一个过程
/// </summary>
/// <returns>返回CEF识别的javascript</returns>
public string Create()
{
//System.Threading.Thread.Sleep(3000);
if (string.IsNullOrEmpty(_functionName)) throw new Exception("JavascriptFull函数名不能为空!"); StringBuilder sb = new StringBuilder(); //头部
if (!string.IsNullOrEmpty(_extensionName))
{
sb.Append(string.Format("if (!{0}) var {0} = {{ }}; ", _extensionName));
}
if (!string.IsNullOrEmpty(_functionName))
{
sb.Append(string.Format("var {0} = function () {{ }}; ", _functionName.ToUpper()));
if (!string.IsNullOrEmpty(_extensionName))
sb.Append(string.Format("if (!{0}.{1}) {0}.{1} = {2};", _extensionName, _functionName, _functionName.ToUpper()));
else
sb.Append(string.Format("if (!{0}) var {0} = {1};", _functionName, _functionName.ToUpper()));
} //开始
sb.Append("(function () {"); //方法
foreach (KeyValuePair<string, string[]> item in _methodName)
{
sb.Append(string.Format("{0}.{1} = function ({2}) {{", _functionName.ToUpper(), item.Key, string.Join(",", item.Value)));
sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Key, string.Join(",", item.Value)));
sb.Append("};");
} //GET属性
foreach (KeyValuePair<string, string> item in _getterPropertyName)
{
sb.Append(string.Format("{0}.__defineGetter__('{1}', function () {{", _functionName.ToUpper(), item.Key));
sb.Append(string.Format("native function {0}(); return {0}();", item.Value));
sb.Append("});");
} //SET属性
if (_setterPropertyArgs.Count == _setterPropertyName.Count)
{
foreach (KeyValuePair<string, string> item in _setterPropertyName)
{
sb.Append(string.Format("{0}.__defineSetter__('{1}', function ({2}) {{", _functionName.ToUpper(), item.Key, string.Join(",", _setterPropertyArgs[item.Key])));
sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Value, string.Join(",", _setterPropertyArgs[item.Key])));
sb.Append("});");
}
} //自定义javascript
for (int i = ; i < _customJavascript.Count; i++)
{
sb.Append(_customJavascript[i]);
} //结尾
sb.Append("})();"); return sb.ToString();
}
}
}

CEF js调用C#封装类含注释的更多相关文章

  1. JS调用JCEF方法

    坐下写这篇文章的时候,内心还是有一点点小激动的,折腾了一个多星期,踩了一个又一个的坑,终于找到一条可以走通的路,内心的喜悦相信经历过的人都会明白~~~~~今儿个老百姓啊,真呀个真高兴啊,哈哈,好了,废 ...

  2. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  3. Google V8编程详解(五)JS调用C++

    http://blog.csdn.net/feiyinzilgd/article/details/8453230 最近由于忙着解决个人单身的问题,时隔这么久才更新第五章. 上一章主要讲了Google ...

  4. Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

    Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. ...

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

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

  6. JS调用webservice服务

    webservice服务 webservice服务代码 using System; using System.Collections.Generic; using System.Linq; using ...

  7. [Winform]CefSharp ——js调用c#方法

    摘要 有时我们在winform中嵌入浏览器,需要在页面上读取电脑上的一些信息,这个时候就需要用到CefSharp的RegisterJsObject进行注册方法然后供js进行调用了. 一个例子 我们在w ...

  8. cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding

    参考:http://www.tairan.com/archives/4902 参考文章是2.x版本的,对于3.0也许不合适了,没有深究. 代码:https://github.com/kenkozhen ...

  9. asp.net 练习 js 调用webservice

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

随机推荐

  1. System.Rtti.TRttiObject.GetAttributes 简例

    MAttribute = class(TCustomAttribute) private FName: string; public constructor Create(AName: string) ...

  2. SRM 514 DIV1 500pt(DP)

    题目简述 给定一个H×W大小的矩阵,每个格子要么是1~9中的一个数,要么是".",要求你把“.”填成具体的数字(1~9),并且符合以下两个要求: 对于所有的整数r 和 c( 0 & ...

  3. 第二百三十七天 how can I 坚持

    最近好像迷上看小说了,<灵域>,而且也感觉会看小说了. 话说,今天好冷啊,真怕在路上冻着就冻萌了,寒风赤骨啊. 好想买个帽子.好想让送个帽子. 睡觉.

  4. Java设计模式系列之桥接模式

    桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地 ...

  5. oracle中in与exists的区别

    exists是用来判断是否存在的,当exists中的查询存在结果时则返回真,否则返回假.not exists则相反. exists做为where 条件时,是先对where 前的主查询询进行查询,然后用 ...

  6. CentOs中iptables配置允许mysql远程访问

    在CentOS系统中防火墙默认是阻止3306端口的,我们要是想访问mysql数据库,我们需要这个端口,命令如下: 1 /sbin/iptables -I INPUT -p tcp --dport 30 ...

  7. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  8. 数据库连接字符串ConnectionString 中的关键字值释义

    ConnectionString 类似于 OLE DB 连接字符串,但并不相同.与 OLE DB 或 ADO不同,如果“Persist Security Info ”值设置为false(默认值),则返 ...

  9. 短信验证倒计时60s

    $("#zphone").click(function(){ var tel2 = $("#regTel").val(); if(flag.tel){ $.po ...

  10. APK的目录结构

    APK 包含以下内容: 被编译的代码文件(.dex文件) 文件资源(resources) assets. 证书(certificates) 清单文件(maifestfile) assets 文件 li ...