dotnet项目使用Cefsharp与Js互相调用函数

news2024/11/15 19:30:59

1. 背景

最近在一个项目中使用 CefSharp 加载H5页面, 其中一些业务逻辑需要调用 Js 函数, 同时 Js 也会调用一些 native 函数:

这里我们使用官方的demo代码进行添加修改, 修改后的代码在此: DevWiki/CefSharp.MinimalExample - CefSharp.MinimalExample - DevWiki Gitea

2. Js调用 Native 函数

根据官方的说明, General Usage · cefsharp/CefSharp Wiki, 分为两步:

  1. 设置 启用 Js
  2. 注册一个 Class 给Js调用
//设置 启用 Js
Browser.BrowserSettings.Javascript = CefState.Enabled;
Browser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
//注册一个 Class 给Js调用
Browser.JavascriptObjectRepository.Register("script", new Script(), false, BindingOptions.DefaultBinder);

public class Script
{
    public string GetWindowName()
    {
        return "MainWindow";
    }

    public void PrintLog(string log)
    {
        Console.WriteLine($"H5 log:{log}");
    }
}

为了方便测试, 给 Browser 设置一下响应 F12 打开 DevTool:

Browser.WpfKeyboardHandler = new WebBrowserWpfKeyboardHandler(Browser);

public class WebBrowserWpfKeyboardHandler : WpfImeKeyboardHandler
    {
        public WebBrowserWpfKeyboardHandler(ChromiumWebBrowser owner) : base(owner)
        {
        }
        public override void HandleKeyPress(KeyEventArgs e)
        {
            base.HandleKeyPress(e);
            if (e.Key == Key.F12)
            {
                owner.ShowDevTools();
            }
        }
    }

运行后 , 按 F12, 打开控制台输入: script. 看看提示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kwCxn2xc-1670731074318)(api/images/iGKYxVbEAHsw/202212102324686.png)]

可以看到 我们注册的函数, 这样Js就可以调用 native函数了.

还有一种方式是动态注册, 如下:

Browser.JavascriptObjectRepository.ResolveObject += JavascriptObjectRepositoryOnResolveObject;

private void JavascriptObjectRepositoryOnResolveObject(object sender, JavascriptBindingEventArgs e)
{
    var repo = e.ObjectRepository;
    if (e.ObjectName == "script")
    {
        repo.Register("script", new Script(), isAsync: true, options: BindingOptions.DefaultBinder);
    }
}

3. WPF调用Js函数

一般的网页都有有 alert() 这个函数, 就是弹出一个对话窗口, 按 F12 打开 devtool 切换到控制台, 输入函数然后回车, 结果如下图:

1670728613515.png

也可以传入一个参数, 显示提示消息: alert("test"):

1670728686336.png

那 如何在 项目中调用呢? 根据官方的文档: CefSharp中文帮助文档 · cefsharp/CefSharp Wiki

Browser.MainFrame.ExecuteJavaScriptAsync("alert()"); 
// 或者
Browser.ExecuteScriptAsync("alert()");

如果需要传入参数, 则可以直接使用字符串插值:

Browser.MainFrame.ExecuteJavaScriptAsync($"alert({message})"); 
// 或者
Browser.ExecuteScriptAsync($"alert({message})");

或者使用传入参数的方法:

object[] args = new object[2];
args[0] = JsArgs1Tb.Text;
args[1] = JsArgs2Tb.Text;
Browser.ExecuteScriptAsync("alert()", args);

如果你安装上述的代码调用带参数的Js 函数, 实际上无法按照你预想的执行!

如果你安装上述的代码调用带参数的Js 函数, 实际上无法按照你预想的执行!

如果你安装上述的代码调用带参数的Js 函数, 实际上无法按照你预想的执行!

重要的事情说三遍!

为何会出现上述问题呢? 这里需要看下 带参数的函数具体做了什么?

    public static void ExecuteScriptAsync(
      this IBrowser browser,
      string methodName,
      params object[] args)
    {
      string javascriptMethodWithArgs = WebBrowserExtensions.GetScriptForJavascriptMethodWithArgs(methodName, args);
      browser.ExecuteScriptAsync(javascriptMethodWithArgs);
    }

在这段代码中, 会先把 函数名称 和 函数参数进行拼接:

WebBrowserExtensions.GetScriptForJavascriptMethodWithArgs(methodName, args);

这里测试下 alert 函数与参数的拼接:

拼接后的结果会自动带上 () , 去除括号后再次测试:

弹窗如下:

在提示出现了我们的填写内容.

3. 总结

使用 Js 调用 native 函数:

  1. WebBrowser 设置启用 Js 功能
  2. 注册一个 class 给 Js 调用

使用 native 调用 js 函数:

  1. 如果是无参函数, 函数名需要带上: ()
  2. 如果是有参数函数, 要么调用时拼接好为完整的函数+参数, 要么调用时使用 WebBrowserExtensions.GetScriptForJavascriptMethodWithArgs 并且函数只写名称不带括号.

以上代码在: DevWiki/CefSharp.MinimalExample - CefSharp.MinimalExample - DevWiki Gitea

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何打开和关闭飞线操作指导

Allegro如何打开和关闭飞线操作指导 Allegro可以打开和关闭飞线,下面介绍如何打开和关闭飞线,具体操作如下 选择display-show rats-all。打开所有nets的飞线 如下图 如果菜单里面添加图标,可以直接点击图标显示所有飞线 选择display-Blank Rats-all关闭所有nets的飞线 …

Spring MVC学习 | 简介HelloWord

文章目录一、Spring MVC简介1.1 MVC回顾1.2 Spring MVC是神魔二、HelloWord2.1 相关文件的准备2.2 创建请求控制器2.3 创建Spring MVC配置文件2.4 测试HelloWord2.4.1 访问首页2.4.2 访问目标页面2.5 执行流程学习视频🎥:https://www.bilibili.com/video…

STM32G4系列存储访问的两个小话题

一、有关CCM访问地址的话题有用过STM32F4系列部分芯片或STM32F334芯片的人,可能知道片内有个CCM【Core Coupled Memory】区域,从芯片系统框图结合文字说明,可以清晰知道这个区域仅能被CPU访问,常用来存放些对执行效率敏感的关键性的代码或数据…

【mmdetection系列】mmdetection之head讲解

目录 1.configs 2.具体实现 3.调用 3.1 注册 3.2 调用 配置部分在configs/_base_/models目录下,具体实现在mmdet/models/*_heads目录下。 这个heads可以是很多个目录下的。 1.configs 我们看下yolox的head吧。 https://github.com/open-mmlab/mmdetection/b…

Web前端开发技术课程大作业:基于HTML+CSS+JavaScript实现校园主题-萍乡田家炳中学校网站(1页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

详细讲解Linux物理内存初始化

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 介绍 让我们思考几个朴素的问题? 系统是怎么知道物理内存的?在内存管理真正初始化之前…

Java项目:SSM实现的校园门户平台网站系统含开题报告与需求分析

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本系统为前后台项目,后台为管理员登录,前台为社团、学生、教师角色登录; 管理员角色包含以下功能&#xff…

对称加密算法(二)(分组密码,Feistel Cipher)

文章目录Traditional Block Cipher StructureStream Ciphers and Block CiphersFeistel CipherReferencesTraditional Block Cipher Structure Stream Ciphers and Block Ciphers 序列密码也称为流密码 (Stream Ciphers), 它是指每次对数字数据流的一个比特或一个…

CSS -- CSS复合选择器总结

文章目录CSS的复合选择器1 什么是复合选择器2 后代选择器3 子选择器4 并集选择器5 伪类选择器6 链接伪类选择器7 :focus 伪类选择器8 复合选择器总结CSS的复合选择器 1 什么是复合选择器 在 CSS 中,可以根据选择器的类型把选择器分为基础选择器和复合选择器&#…

【博客554】k8s 中的 Client-Side Apply 和 Server-Side Apply

k8s 中的 Client-Side Apply 和 Server-Side Apply 背景 如果你经常与 kubectl 打交道,那相信你一定见过 kubectl.kubernetes.io/last-applied-configuration annotation,以及那神烦的 managedFields,像这样: kubectl get pods…

单元测试理论储备及JUnit5实战

概述 测试驱动开发,TDD,Test Driven Development,优点: 使得开发人员对即将编写的软件任务具有更清晰的认识,使得他们在思考如何编写代码之前先仔细思考如何设计软件对测试开发人员所实现的代码提供快速和自动化的支…

银保监机构保险许可证数据(2007-2022年)

保险是金融系统的重要组成部分,保险的经济补偿和资金融通功能对维持金融系统的稳定,维护整个社会的安定起着不可或缺的作用,因此,从现实意义上来讲,对于我国保险业系统性风险的研究是很有必要性的。 通过对保险业系统性风险的类型、传播机制的研究,可以有效防范并降低我国保险…

MATLB|基于粒子群优化算法的智能微电网调度(含风、光、微型燃气轮机、电网输入微网、储能)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

linux基本使用及服务器环境搭建

文章目录0.linux基本命令1.配置jdk环境变量2.安装tomcat3. mysql安装4.部署jar项目基本命令5. 前端项目继承到后端项目中0.linux基本命令 1.pwd 我在那里 2.who am i 我是谁 3.clear 清屏 4.ctrlc 强制停止 5.ip addr 查看地址 6.ping 是否联通网站 7.systemctl start|s…

分布式系统的解决方案,学好这个就够了

分布式、负载、消息队列等一些解决方案,在互联网公司应用已经非常普遍了,也是每一个程序员要成为技术专家、架构师必学的知识。 所以,今天给大家推荐一个开源项目,有关互联网项目常见的解决方案,通通都打包一起了。 …

10个 解放双手的 IDEA 插件,少些冤枉代码

正经干活用的 分享一点自己工作中得心应手的IDEA插件,可不是在插件商店随随便便搜的,都经过实战检验,用过的都说好。可能有一些大家用过的就快速划过就行了。 1、GenerateAllSetter 实际的开发中,可能会经常为某个对象中多个属性…

半监督下的点云

搬了这么个东东来~~ 不过他的名字有点容易叫大家混淆,所以没写标题上... 在训练阶段,只需少量的二维方框标注作为指导,本文的网络就可以从激光雷达方框中产生精确的具有三维属性的图像级长方体标注。 论文:https://arxiv.org/pdf/2211.0930…

【Dubbo3高级特性】「实战开发」自定义扩展实现Dubbo服务对外暴露的主机地址实战开发指南

内容主旨 本篇文章主要介绍了如何进行自定义Dubbo服务对外暴露的主机地址的实战技术方案,其中我们需要针对于服务提供者侧的host主机暴漏的目的以及如何进行定制化处理 特性说明 在Dubbo中,Provider启动时主要做两个事情 启动服务提供者的server端实…

基于C++实现(控制台+界面)通讯录管理系统【100010012】

个人通讯录管理系统 问题描述: 主要内容: 个人通讯录是记录了同学(包含一起上学的学校名称)、同事(包含共事的单位名称)、朋友(包含认识的地点)、亲戚(包含称呼&#…

Python小炼(2):文件操作

"一封信,写下太多如果" 如果有一定语言基础的,一定对文件操作十分得"熟悉"!当然,这种熟悉是 引起人恼怒的 也不为过。 python 也有自己的文件操作,那它跟C\C又有何不同呢? 一、文件的基本操作 (…