如何解决在 WebView2 中触发 onbeforeunload
此 answer 展示了如何通过以下方式触发 Webbrowser 控件中的 onbeforeunload 事件:
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (!this.formsWebbrowser.Isdisposed)
{
//// Generate SHDocVw.dll: Visual Studio Developer Command Prompt "tlbimp.exe ieframe.dll /out: C:\temp\SHDocVw.dll",var activeX = this.formsWebbrowser.ActiveXInstance;
var input = Type.Missing;
object leavePage = true;
((SHDocVw.Webbrowser)activeX).ExecWB(
SHDocVw.OLECMDID.OLECMDID_ONUNLOAD,SHDocVw.OLECMDEXEcopT.OLECMDEXEcopT_DODEFAULT,ref input,ref leavePage);
if (!(bool)leavePage)
{
e.Cancel = true;
return;
}
}
base.OnFormClosing(e);
}
但现在尝试从 IE11(由 Webbrowser 使用)迁移到带有 WebView2 控件的 Edge Chromium,我不知道如何在 WebView2 中做同样的事情。
将 WebView2 导航到另一个页面时,该对话框正确显示。 当用户关闭应用程序或包含 WebView2 的窗口时,问题就出现了。 然后它会关闭而不显示任何对话框。
这就是上面的代码对 Webbrowser 控件所做的事情,当关闭应用程序时,IE11 浏览器中会触发 (on)beforeonload 事件并返回一个布尔值。如果用户按下“离开”或没有激活 beforeonload 事件,则为真,如果用户按下“留在页面上”,则为假。
调用 ExecuteScriptAsync("onbeforeunload();") 的方法(在使用 window.addEventListener("beforeunload",function(event) { 设置事件时不起作用)。 .. });) 如何在 WebView2 中做同样的事情?
编辑:
问题是我不想在关闭时总是显示对话框,除非我真的必须这样做。
我只想在页面有未保存的更改时显示它(并且它在 JavaScript 的 beforeunload
事件中传达了这一点)。
我知道如何在 C# 代码中处理它的唯一方法是触发内置的 onunload
事件,在浏览器中显示 beforeunload
对话框。
这正是 ActiveXInstance.ExecWB(OLECMDID_ONUNLOAD)
为 Webbrowser 控件和 IE11 所做的。
在 WebView2/Chromium 中以同样的方式触发该事件可能根本不可能?这真的是我想问的。
我曾尝试在 FormClosing
事件中调用 JavaScript,但应用程序只是关闭而无需等待响应。
我想唯一的其他选择是删除 x-close 按钮并使用可以执行所需检查的自定义关闭按钮,然后关闭应用程序。
解决方法
这对我有用。您可以将其与表单关闭或其他内容结合使用。不要忘记在适当的地方正确分离事件/处置。这只是一个示例。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender,EventArgs e)
{
DoWork();
}
private async Task DoWork()
{
await webView21.EnsureCoreWebView2Async();
webView21.CoreWebView2.Settings.AreDefaultScriptDialogsEnabled = false;
webView21.CoreWebView2.ScriptDialogOpening += CoreWebView2_ScriptDialogOpening;
await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("window.addEventListener('beforeunload',function(e) { return event.returnValue = 'prompt';});");
webView21.Source = new Uri("https://www.google.com");
}
private void CoreWebView2_ScriptDialogOpening(object sender,Microsoft.Web.WebView2.Core.CoreWebView2ScriptDialogOpeningEventArgs e)
{
if (MessageBox.Show("do you want to leave","Leave?",MessageBoxButtons.OKCancel) == DialogResult.OK)
{
e.Accept();
}
else
{
e.GetDeferral();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。