关于CefSharp中C#与JS函数互相调用的应用
作者:咕魂
时间:2022年5月6日
大量博文可以看到一些C#与JS脚本相互调用的案例,但是不同版本的CefSharp使用时还是有一点不同,博主本次使用的CefSharp版本为100.0.230.0,查看方法按住Ctrl点击ChromiumWebBrowser可以看到程序集开头有写到版本号。
接下来是正文:
JS调用C#函数
// 使用ChromiumWebBrowser时进行的状态设置
// 其中chromiumWebBrowser为实例化的ChromiumWebBrowser对象,
// CefSharpSettings是直接设置静态类的属性,也能先创建对象,但是没必要
chromiumWebBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
CefSharpSettings.WcfEnabled = true;
chromiumWebBrowser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder);
// BoundObject.class的写法
class BoundObject
{
  public string hello()
  {
    return "hello";
  }
}
注:旧版本使用
chromiumWebBrowser.RegisterJsObject("bound", new BoundObject(), options: BindingOptions.DefaultBinder);
并且博主使用时直接使用``CefSharpSettings.LegacyBindingEnabled会出现LegacyBindingEnabled`未定义的错误。
html中调用函数的代码:
<script>
  // 如果bound对象存在,则调用bound中的hello函数
  // 注意此处bound字段一定要和之前代码Register函数的第一个参数一致
  if(bound){
    console.log(bound.hello());
  }
</script>
不出意外,你能够在C#程序运行后,查看浏览器组件的控制台,可以看到hello的输出信息。
C#调用JS函数
// 其中chromiumWebBrowser为实例化的ChromiumWebBrowser对象
string javascript = "hello();";
chromiumWebBrowser.ExecuteScriptAsync(javascript);
html中的代码
<script>
    function hello(){
        console.log("hello")
    }
</script>
如果你是和我一样,在chromiumWebBrowser刚刚加载页面后就直接调用ExecuteScriptAsync()函数执行JS脚本,不出意外应该会报一个hello未定义的错误。
但是如果把调用ExecuteScriptAsync()的函数写在winform的按钮事件中,加载完页面之后,点击按钮再执行,就能够成功在浏览器组件的控制台看到输出的hello字样。
总结
按理来说,如果在页面刚刚加载就执行一段脚本从C#传数据过来,两种方法应该都是可行的,但C#调用JS函数时一定要等页面完整加载之后再调用,不然会出现函数未定义的情况,可以先查询一下页面加载的情况再执行,这里,我使用的是第一种(JS调用C#函数)方法,通过JS调用C#函数来传递数据。
之后如果html页面中的触发函数需要执行C#函数,就使用第一种(JS调用C#函数)方法,如果是winform组件的触发事件要执行JS函数,就使用第二章(C#调用JS函数)方法。
C#数据往JS部分传递两种方法都可以,但JS的数据往C#部分传递,则只能使用第一种(JS调用C#函数)方法。
提示
打开浏览器控制台的方法:
// 点击按钮button1打开控制台,也能写到其他chromiumWebBrowser初始化之后的地方
private void button1_Click(object sender, EventArgs e)
{
  if (chromiumWebBrowser != null)
  	chromiumWebBrowser.ShowDevTools();
  else
  	MessageBox.Show("浏览器暂未加载...");
}
相关连接:
cefsharp 如何成功获取加载完毕后,网页的源代码-前端-CSDN问答
CefSharp内核浏览器之C#与js的互相调用_饮尽鸿爪下的雪泥的博客-CSDN博客
升级CefSharp解决RegisterJsObject方法弃用问题_黑石雨的博客-CSDN博客
CefSharpSettings.LegacyJavascriptBindingEnabled 没有该属性 - 简书 (jianshu.com)
关于CefSharp中C#与JS函数互相调用的应用的更多相关文章
- HTML中直接写js 函数
		
1.在HTML中直接写JS函数: <body onload="javascript:{window.location.href='http://www.baidu.com/'}&quo ...
 - Unity3D中C#和js方法相互调用
		
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
 - js函数的调用问题
		
1.js函数的调用方式有三种.请问以下“二”处的几行代码有什么猫腻? //一 事件调用 btn.onclick=fn; //二 直接调用(window调用) fn(); //自上而下解析到这一行的时候 ...
 - 工作中常用的JS函数整理分享(欢迎大家补充)
		
今年在渣X工作整理的常用JS函数 今年来了渣X工作,我所在这个部门分工很奇怪,CSS竟然有专门的人在搞,开发PHP的人员需要处理JS,以至于有时候开发起来不是那么得心应手,感觉把JS和CSS拆开就像是 ...
 - JS函数-我调用自己试试看
		
前言 最近在读<JavaScript语言精粹>,对递归函数有了进一步的认识,希望总结下来: 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归 ...
 - flash、js 函数 互相调用
		
js调用flex函数 flex 利用ExternalInterface.addCallback(“注册的方法名”,As中的函数名)进行注册 js中,用document.getElementById(“ ...
 - gwt中java与js的相互调用
		
1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...
 - 在HTML标签元素中,绑定JS函数
		
<a onclick="ShowMsg(this)" id="myA" href="#">按钮</a> //JS方法 ...
 - 在JS中,一个自定义函数如何调用另一个自定义函数中的变量
		
function aa1511() { var chengshi="马鞍山"; var shengfen="安徽省"; return shengfen+&quo ...
 - js 函数的调用模式
		
1.函数调用 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数.除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组, ...
 
随机推荐
- JAVA 用时间生成主键ID
			
/** * 生成主键(19位数字) * 主键生成方式,年月日时分秒毫秒的时间戳 例如:1810311557430000845 */ public static synchronized Long ge ...
 - Ubuntu安装部署Zabbix网络监控平台和设备配置添加
			
概述 Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持. Zabbix 是一个企业级的开源分布式监控解决方案. Zabbix 是一款监控众多参数的 ...
 - Python中的模块包
			
dir0/dir1/dir2/mod.py,dir0必须在环境变量中,可以import dir1,import dir1.dir2.mod.但在python3.3之前,dir1和dir2下必须存放一个 ...
 - Solon AI 正试发布(支持 java8+,RAG,MCP)
			
Solon AI 正试发布了(版号,随 Solon v3.3.1).历时小半年. 1.简介 Solon AI 是一个 Java AI(智能体) 全场景应用开发框架,提供有丰富的接口能力.主要支持的的智 ...
 - ODOO路由里面的auth="user" 的使用
			
一.controller介绍:Controller层在odoo里面可以认为是控制器,根据url地址来控制后端的业务和前端的内容展示,我们一般偏向于叫路由控制, 它相当于内网和外网之间的防火墙,外网的请 ...
 - 面试题:HashMap和Hashtable的区别和联系
			
摘要:从源码.特性和算法实现等几个角度归纳HashMap和Hashtable的区别和联系. HashMap与Hashtable的区别是面试中经常遇到的一个问题.此问题看似简单,但如若深挖,也可以学 ...
 - 【语义分割专栏】2:U-net原理篇(由浅入深)
			
目录 前言 背景介绍 U-net核心剖析 编码解码结构(U形状) 卷积模式 跳跃连接 add concat 其他细节 overlap-tile策略 弹性形变 U-net模型代码 结语 参考资料 前言 ...
 - MQ的学习记录~
			
MQ是一个消息中间件,是为了解决发送者和接收者处理速度不匹配的问题而产生的,有队列和主题两种. 队列:一对一. 主题:一对多.例如有100人订阅了我的公众号,当我在公众号上发布新的文章时100人都能收 ...
 - Golang指针解析
			
一.简单说明 golang指针可以这样理解:本身为一个整型常量,但由于其声明时为指针,因此拥有了特殊的能力,即在其前增加 * ,即可直接访问内存编号为该整型常量的数据.而对于某个定义的常量,在前面加 ...
 - gRPC 学习了解记录
			
背景 项目中需要用到gRPC,所以需要去了解它的使用.去官网看它的介绍以及run Quick start run quickStart 遇到问题 根据官网的介绍,run Quick start 的时候 ...