今天,我决定在一个www.example.com应用程序中将WebView
控件迁移到WebView2
控件VB.net。
我已经从NuGet
安装了WebView2
,并且更改了声明和初始化行(在我的VB程序中只有4行,因为我使用的是2个WebView 2)。
当我构建我的应用程序时,Visual Studio 2019
指示ScriptNotify
事件不是WebView2
的事件!
Private Sub wvSelect_ScriptNotify(
sender As Object,
e As WebViewControlScriptNotifyEventArgs) Handles wvSelect.ScriptNotify
使用旧的WebView
控件,此事件使用windows.external.notify
Javascript函数生成。
function clickPlus(e) { window.external.notify("+PLUS:"); }
哪个事件正在替换WebView2
控件中的ScriptNotify
事件?
我很想知道这个新事件,以及如何从Javascript调用这个事件。
2条答案
按热度按时间pkbketx91#
使用WebView2处理事件通知的几种可能情况:
另请参阅:Use JavaScript in WebView for extended scenarios。
一般初始化:
myWebView2
。此外,我还使用了这个简单的类模型,用于反序列化接收到的JSON消息,因为WebView2.WebMessageReceived采用JSON格式;但是您可以传递任何您想要的字符串。
**1 -**在此方案中,JavaScript函数已在HTML中定义
JSON.stringify()
强调返回值是JSON对象在本例中,您只需要订阅
WebMessageReceived
事件并反序列化JSON:注意:我使用的是e.TryGetWebMessageAsString()而不是e.WebMessageAsJson,因为后者用引号括起来(double-stringified)。
**2 -**此处,
HEAD
中定义了一个可以通知消息的JavaScript函数,但其他位置没有添加事件处理程序。假设您将在运行时添加HTML元素,或者您不希望在HTML或其他任何内容中添加事件处理程序。
像以前一样订阅
WebMessageReceived
事件和NavigationCompleted事件。加载文档时会引发此事件。我们需要此事件,因为在示例中,事件处理程序被添加到正文中的元素,而正文在此之前不可用。在
NavigationCompleted
中,我们可以将JavaScript Function添加到字符串中并调用WebView2.ExecuteScriptAsync()方法,该方法在DOM准备好后执行脚本,否则GetElementById()
将找不到目标。**3 -**这一次,HTML中的任何位置都没有定义JavaScript函数。
案例1:
像以前一样订阅
WebMessageReceived
和NavigationCompleted
事件。在
NavigationCompleted
中,发布消息的JavaScript函数直接添加到事件处理程序。调用ExecuteScriptAsync()
以执行脚本并将事件监听程序添加到HTML元素。案例2:
订阅
WebMessageReceived
和WebView2.CoreWebView2InitializationCompleted。在本例中,我们向Document添加了一个事件侦听器,然后使用
Event.Target
成员和任何其他有助于处理通知的属性或值来确定单击了哪个Element。这里,我只是将
[Event].target.id
和[Event].target.innerText
作为JSON属性传递。kuarbcqp2#
我的问题现在解决了,我的解决方案如下...
我要显示以下HTML页
为了拦截数字上
click
,我编写了以下Javascript行如您所见,我调用
postMessage()
函数向VB.Net代码发送通知。为了初始化和显示我HTML代码,我写了下面几行
其中
WebView2
控件是在窗体的设计器部分中定义的最后,为了拦截JavaScript通知,我编写了以下VB.Net代码
我希望我在这个答案中所报告的可以帮助其他用户完成
Jimi
的答案。