微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 WebView2 中触发 onbeforeunload

如何解决在 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 举报,一经查实,本站将立刻删除。