.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 ...
随机推荐
- SqlMapConfig.xml文件详解
SqlMapConfig.xml 是 mybatis 的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHan ...
- 学习Solr(一)
一.安装 1.需要的安装包:apache-tomcat-7.0.47.tar.gz.solr-4.10.3.tgz.tgz(jdk自行安装) 2.解压tomcat并创建solr文件夹 [root@lo ...
- log4J——在Spring中的使用
log4J简介 1.通过 log4j 可以看到程序运行过程中更详细的信息 (1)经常使用 log4j 查看日志 2.使用 (1)导入 log4j 的jar包 (2)复制 log4j 的配置文件,复制到 ...
- 记录md的偏好设置
- sublime text3 好用的插件
sublime text3 推荐插件 Package Controller安装 1.打开sublime text 3,按ctrl+~或者菜单View > Show Console打开命令窗口.2 ...
- 百度开放云 BOS Uploader
百度开放云 BOS Uploader bce-bos-uploader 是基于 bce-sdk-js 开发的一个 ui 组件,易用性更好.DEMO地址是:http://leeight.github.i ...
- canvas离屏、旋转效果实践——旋转的雪花
效果展示理论基础--"常见的canvas优化--模糊问题.旋转效果" 用离屏canvas画基础部分 1.封装画线函数 function drawLine(ctx,x1,y1,x2, ...
- 用Weex开发的V2EX三端app,附探坑总结
项目地址 git传送门(内附项目预览) Weex环境配置 npm install -g weex npm install -g weexpack # weex客户端的cli npm install - ...
- vue2实现搜索结果中的搜索关键字高亮
// 筛选变色 brightenKeyword(val, keyword) { val = val + ''; if (val.indexOf(keyword) !== -1 && k ...
- java中finally块儿是怎么工作的?有什么意义?
10.finally块 马克-to-win:finally块儿是怎么工作的?有什么意义?finally关键字创建一个代码块.没有try,finally块儿不能单独存在.该代码块在一个try/catch ...