.NET混合开发解决方案10 WebView2控件调用网页JS方法
WebView2控件应用详解系列博客
.NET混合开发解决方案2 WebView2与Edge浏览器的区别
.NET混合开发解决方案5 WebView2运行时与分发应用
.NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件
.NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件
客户端程序(WinForm、WPF、Win32、WinUI)集成WebView控件加载Web完成后,还有两种常见的需求
- C#调用JS方法
- 执行通用方法,设置网页特效。
- 调用网页中定义的JS方法,执行计算等。
- JS调用C#方法
本文讲解第一种需求的实现方式。
WebView2控件提供了2个方法用于执行JavaScript脚本
- ExecuteScriptAsync
- 在 WebView2 控件中运行 JavaScript。 加载页面文档对象模型(DOM)内容或完成导航后调用此方法。
- AddScriptToExecuteOnDocumentCreatedAsync
- 创建 DOM 时,在每个页面上运行。 初始化 CoreWebView2 后调用此方法。
由于ExecuteScriptAsync()的结果是JSON编码的,所以如果计算JavaScript的结果是一个字符串,那么将收到一个JSON编码的字符串,而不是字符串的值。例如,以下代码执行导致字符串的脚本。 生成的字符串包括开头的引号、末尾的引号和转义斜杠:


如果从脚本调用 JSON.stringify ,则结果将作为 JSON 字符串进行双重编码,其值为 JSON 字符串。

只有直接在结果中的属性包含在 JSON 编码的对象中;继承的属性不包括在 JSON 编码的对象中。 大多数 DOM 对象继承所有属性,因此需要将它们的值显式复制到另一个对象中才能返回。 例如:
执行 performance.memory 返回时由于所有属性都是继承的,因此在结果中看不到其任何属性。

如果改为将特定属性值从 performance.memory 复制到自己的新对象中返回,则会在结果中看到这些属性。
(() => { const {totalJSHeapSize, usedJSHeapSize} = performance.memory; return {totalJSHeapSize, usedJSHeapSize}; })();

通过 ExecuteScriptAsync()执行脚本时,会在全局上下文中运行。 将脚本置于匿名函数中有助于使定义的任何变量不会污染全局上下文。
如果将js的逻辑写在字符串中,相对来说写的时候比较困难,如没有语法提示、逻辑检查等,因此很难在Visual Studio中编写大量代码。若要解决此问题,请使用代码创建单独的 JavaScript 文件,然后使用参数传递对该文件的 ExecuteScriptAsync 引用。
1、在项目中创建JS文件,并添加要运行的 JavaScript 代码。如 script.js。
2、将 JavaScript 文件转换为传递到 ExecuteScriptAsync的字符串,方法是在页面导航完成后粘贴以下代码:
string text = System.IO.File.ReadAllText(@"C:\XXXX\script.js");
3、使用以下方法 ExecuteScriptAsync传递文本变量:
await webView.CoreWebView2.ExecuteScriptAsync(text);
1、新建一个WebFom项目

调整页面逻辑

运行程序并测试

WebView2调用JS方法的逻辑

WebView2控件加载网页后,如果将一个文件(如:script.js、script.txt等)拖拽到WebView2控件上,将自动执行文件,效果如下

可以通过webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync()方法运行脚本禁用拖拽功能
await webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(
"window.addEventListener('dragover',function(e){e.preventDefault();},false);" +
"window.addEventListener('drop',function(e){" +
"e.preventDefault();" +
"console.log(e.dataTransfer);" +
"console.log(e.dataTransfer.files[0])" +
"}, false);");
再次运行后,拖拽文件为WebView2控件上无任何反应,说明拖拽功能已被禁用

使用 webView2.CoreWebView2.ExecuteScriptAsync() 方法执行上述脚本同样可以达到相同的效果。
还可以执行脚本来禁用网页右键菜单功能
await webView.CoreWebView2.ExecuteScriptAsync("window.addEventListener('contextmenu', window => {window.preventDefault();});");
开发者还可以执行其他自定义脚本来设置网页的效果。
.NET混合开发解决方案10 WebView2控件调用网页JS方法的更多相关文章
- .NET混合开发解决方案15 WebView2控件集成到WinForm程序编译后的文件及结构说明
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案9 WebView2控件的导航事件
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案11 WebView2加载的网页中JS调用C#方法
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案14 WebView2的基本身份验证
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案24 WebView2对比CefSharp的超强优势
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- 混合开发 webview 中file 控件 点击后无反应解决方法
最近在做个项目 ,需要 使用 file 控件上传 图片到服务器 ,在手机浏览器中 可以正常选择照片,但是放到 android 应用中的webview中,file 控件点击后就没有反应. 百度了一番后, ...
- .NET混合开发解决方案13 自定义WebView2中的上下文菜单
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案16 管理WebView2的用户数据
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- .NET混合开发解决方案5 WebView2运行时与分发应用
系列目录 [已更新最新开发文章,点击查看详细] 发布使用Microsoft Edge WebView2的应用程序时,客户端计算机上需要安装WebView2运行时,可以安装自动更新的Evergr ...
随机推荐
- idea-中的Mark Diretory as的内容
Sources Root:告诉idea这个文件夹及其子文件夹中包含源代码,是需要编译构建的一部分 Test Sources Root:测试源文件夹允许您将与测试相关的代码与生产代码分开.通常,源和测试 ...
- 学习Solr(三)
本文以solr5为例说明在linux系统上单机安装过程. 一. solr的安装 1. solr能够安装在不同的操作系统上,安装solr前需要安装何时的JRE.当前版本5.5最低需要JRE1. ...
- yum下载安装git服务
yum install git 安装成功后,配置 用户 邮箱信息 注: youxiu326 github账号名称 youxiu326@163.com github账号对应邮箱 git confi ...
- func-spring-boot-starter 匿名函数托管
func-spring-boot-starter 匿名函数托管 GitHub项目路径: https://github.com/yiurhub/func-spring-boot-starter Gite ...
- python学习笔记(九)——线程与进程
一.线程 Python 中为我们提供了两个模块来创建线程. _thread threading thread 模块已被废弃.用户可以使用 threading 模块代替.所以,在 Python 中不能再 ...
- Spring Framework远程代码执行漏洞复现(CVE-2022-22965)
1.漏洞描述 漏洞名称 Spring Framework远程代码执行漏洞 公开时间 2022-03-29 更新时间 2022-03-31 CVE编号 CVE-2022-22965 其他编号 QVD-2 ...
- An=n的前n项和的前n项和
#include<iostream> using namespace std; int main() { int n,a=0,b=0; cin>>n; for(int i=1; ...
- kafka快速入门到精通
目录 1. 消息队列两种模式 1.1 消息队列作用 1.2 点对点模式(一对一,消费者主动拉取数据,消息收到后消息删除) 1.3 发布/订阅模式(一对多,消费数据之后不会删除消息) 1.4 kafka ...
- PyQt5 基础知识(六):展示控件
目录 3. 展示控件 3.1 QLabel 3.1.1 描述 3.1.2 功能作用 3.1.2.1 基本功能 3.1.2.2 文本交互 3.1.2.3 内容操作 3.1.2.3.1 文本字符串 3.1 ...
- MFC---典型类和函数
在MFC中,典型的类有CString.CRect.CDialog等,这些类的使用方法是通用的,下文以CString类的使用为例做一个详细说明.类的使用主要还是使用类的方法,可以查看类的定义,查看这个类 ...