[摘录] WebView2 与 JS 交互
https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/gettingstarted/win32
步骤 5-脚本
托管应用还可以将 JavaScript 插入 Web 视图。 你可以通过任务 Web 视图执行任意 JavaScript 或添加初始化脚本。 已添加的初始化脚本将应用于所有未来的顶级文档和子框架导航,直到被删除,并在创建全局对象之后以及执行 HTML 文档包括的任何其他脚本之前运行。
复制以下代码片段并粘贴到其中 HelloWebView.cpp
。
// Schedule an async task to add initialization script that freezes the Object object
webviewWindow->AddScriptToExecuteOnDocumentCreated(L"Object.freeze(Object);", nullptr);
// Schedule an async task to get the document URL
webviewWindow->ExecuteScript(L"window.document.URL;", Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
[](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT {
LPCWSTR URL = resultObjectAsJson;
//doSomethingWithURL(URL);
return S_OK;
}).Get());
现在,Web 视图应该始终冻结 Object
对象并返回页面文档一次。
备注
脚本注入 Api \ (以及某些其他 WebView2 Api \)是异步的,如果必须按特定顺序运行代码,则应使用回调。
步骤 6-主机和 web 内容之间的通信
宿主和 web 内容也可能通过该方法互相通信 postMessage
。 在 web 视图内运行的 web 内容可能会通过该方法向主机发布 window.chrome.webview.postMessage
,并且消息由主机上任何注册的 ICoreWebView2WebMessageReceivedEventHandler
事件处理程序处理。 同样,主机可以通过 " ICoreWebView2::PostWebMessageAsString
或" ICoreWebView2::PostWebMessageAsJSON
方法处理 web 内容,这由从侦听器添加的处理程序捕获 window.chrome.webview.addEventListener
。 通信机制允许 web 内容通过将消息传递给请求主机调用本机 Api 来利用本机功能。
作为了解机制的示例,当你尝试在 Web 视图中打印文档 URL 时,将发生以下步骤。
- 主机注册处理程序以返回收到的消息,返回到 web 内容
- 主机将向注册处理程序的 web 内容插入脚本,以便从主机打印消息
- 主机为将 URL 发布到主机的 web 内容插入脚本
- 将触发主机的处理程序,并将消息 \ (URL \)返回到 web 内容
- 将触发 web 内容的处理程序,并通过主机 \ (URL \)打印消息
复制以下代码片段并粘贴到其中 HelloWebView.cpp
。
// Set an event handler for the host to return received message back to the web content
webviewWindow->add_WebMessageReceived(Callback<ICoreWebView2WebMessageReceivedEventHandler>(
[](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs * args) -> HRESULT {
PWSTR message;
args->TryGetWebMessageAsString(&message);
// processMessage(&message);
webview->PostWebMessageAsString(message);
CoTaskMemFree(message);
return S_OK;
}).Get(), &token);
// Schedule an async task to add initialization script that
// 1) Add an listener to print message from the host
// 2) Post document URL to the host
webviewWindow->AddScriptToExecuteOnDocumentCreated(
L"window.chrome.webview.addEventListener(\'message\', event => alert(event.data));" \
L"window.chrome.webview.postMessage(window.document.URL);",
nullptr);
https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2/gettingstarted
Step 5 - Scripting
The hosting app can also inject JavaScript into WebView. You can task WebView to execute arbitrary JavaScript or add initialization scripts. Added initialization scripts apply to all future top level document and child frame navigation until removed, and run after the global object has been created and before any other script included by the HTML document is executed.
Copy the following code below // Step 5 - Scripting
.
// Schedule an async task to add initialization script that freezes the Object object
webviewWindow->AddScriptToExecuteOnDocumentCreated(L"Object.freeze(Object);", nullptr);
// Schedule an async task to get the document URL
webviewWindow->ExecuteScript(L"window.document.URL;", Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
[](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT {
LPCWSTR URL = resultObjectAsJson;
//doSomethingWithURL(URL);
return S_OK;
}).Get());
Now WebView will always freeze the Object object and return the page document once.
Note that these script injection APIs (and some other WebView2 APIs) are asynchronous, you should use callbacks if code is to be executed in a particular order.
Step 6 - Communication between host and web content
The host and the web content can also communicate with each other through postMessage
. The web content running within a WebView can post to the host through window.chrome.webview.postMessage
, and the message would be handled by any registered ICoreWebView2WebMessageReceivedEventHandler
on the host. Likewise, the host can message the web content through ICoreWebView2::PostWebMessageAsString
or ICoreWebView2::PostWebMessageAsJSON
, which would be caught by handlers added from window.chrome.webview.addEventListener
. The communication mechanism allows the web content to utilize native capabilities by passing messages to ask the host to call native APIs.
As an example to understand the mechanism, let's try printing out the document URL in WebView with a little detour,
- the host registers a handler to return received message back to the web content
- the host injects a script to the web content that registers a handler to print message from the host
- the host injects a script to the web content that posts the URL to the host
- the host's handler is triggered and returns the message (the URL) to the web content
- the web content's handler is triggered and prints the host's message (the URL)
Copy the following code below // Step 6 - Communication between host and web content
,
// Set an event handler for the host to return received message back to the web content
webviewWindow->add_WebMessageReceived(Callback<ICoreWebView2WebMessageReceivedEventHandler>(
[](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs * args) -> HRESULT {
PWSTR message;
args->TryGetWebMessageAsString(&message);
// processMessage(&message);
webview->PostWebMessageAsString(message);
CoTaskMemFree(message);
return S_OK;
}).Get(), &token);
// Schedule an async task to add initialization script that
// 1) Add an listener to print message from the host
// 2) Post document URL to the host
webviewWindow->AddScriptToExecuteOnDocumentCreated(
L"window.chrome.webview.addEventListener(\'message\', event => alert(event.data));" \
L"window.chrome.webview.postMessage(window.document.URL);",
nullptr);
[摘录] WebView2 与 JS 交互的更多相关文章
- 关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友
关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可
- webView和js交互
与 js 交互 OC 调用 JS // 执行 js - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *title = [web ...
- 李洪强iOS经典面试题147-WebView与JS交互
李洪强iOS经典面试题147-WebView与JS交互 WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...
- WebView---Android与js交互实例
Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true 原文地址:http://blog.csdn.net/it10 ...
- iOS与JS交互实战篇(ObjC版)
前言 ObjectiveC与Js交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了.这里只介绍iOS7.0后出来的JavaScriptCore framework. 关于JavaS ...
- Android WebView加载本地html并实现Java与JS交互
最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...
- WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- WKWebView新特性及JS交互
引言 一直听说WKWebView比UIWebView强大许多,可是一直没有使用到,今天花了点时间看写了个例子,对其API的使用有所了解,为了日后能少走弯路,也为了让大家更容易学习上手,这里写下这篇文章 ...
- 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析
作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
随机推荐
- Linux中&&、&、|、||等特殊符号
&& 和 & & 表示任务后台执行,与nohup命令功能差不多. # 运行jar包,并且置于后台执行,执行的日志重定向到当前默认的log.txt文件中 [root@lo ...
- 简单了解java中的io流中的字节流
了解一下前置知识字符集,我们常见的字符集有ASCII,GBK,UTF-8 GBK中一个字需要两个字节存储 UTF-8中一个字母需要一个字节,并以0开头,一个汉字需要三个字节,与GBK不同的是,他支持的 ...
- linux中grep的用法详解
linux中grep的用法详解 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是 ...
- 常用的adb命令(重要)
常用的adb命令(重要)
- 【转载】 GPU地址空间的相关概念
为了结合上篇 文章 https://www.cnblogs.com/devilmaycry812839668/p/13264080.html 对RTX显卡是否能够实现P2P通信功能,同时专业级别显 ...
- xshell打开vim后颜色异常——xshell连接ubuntu打开vim后界面覆盖一层绿色
参考原文: https://blog.csdn.net/Blank_Shen/article/details/106527312 =================================== ...
- 作为电脑屏幕的补光灯,到底是应该选Led灯还是荧光灯
现在的台灯灯具市场基本被Led灯给霸占,这就无形之中要大家买台灯的时候只能选择Led等,我也是如此,手上有一款20年前上高中时候的"孩视宝"荧光灯的台灯,然后还有一款刚刚购入的Le ...
- 【转载】python的魔法方法———A Guide to Python's Magic Methods
原文地址: https://rszalski.github.io/magicmethods/ ===================================================== ...
- mysql数据库中decimal数据类型比较大小
在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用.当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如 ...
- 利用Stream实现简单的等差数列求和
我们都熟知高斯的故事,认识等差数列也是从这个故事开始的,编程课程为了练习for循环,也在不断的练习这个从1加到100的例子,那么原始的办法是这样的: int sum1 = 0; for (int i ...