You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断WebView2中新窗口请求是否来自鼠标滚轮点击

在WinUI3 WebView2中区分新窗口的触发方式(左键/滚轮点击)

实现思路

通过JavaScript监听页面鼠标点击事件,记录新窗口的触发类型(左键或滚轮点击),再在.NET端的NewWindowRequested事件中获取该状态,进而控制是否激活新标签页。

具体实现步骤

1. 注入JavaScript监听脚本

在WebView2初始化完成后,注入用于记录触发方式的JS代码,确保每个页面加载时都能生效:

private async void WebView2_InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        await webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(@"
            let newWindowTrigger = 'unknown';
            
            // 监听所有链接的鼠标点击事件,记录触发按钮
            document.addEventListener('click', function(e) {
                const target = e.target.closest('a');
                if (target && target.target === '_blank') {
                    newWindowTrigger = e.button === 0 ? 'left_click' : 
                                      e.button === 1 ? 'middle_click' : 'unknown';
                }
            }, true);
            
            // 重写window.open,保留原始逻辑的同时复用已记录的触发状态
            const originalOpen = window.open;
            window.open = function(url, target, features) {
                return originalOpen.call(window, url, target, features);
            };
            
            // 提供供.NET调用的方法,获取触发状态并重置
            window.getNewWindowTrigger = function() {
                const trigger = newWindowTrigger;
                newWindowTrigger = 'unknown';
                return trigger;
            };
        ");
    }
}

2. 处理NewWindowRequested事件

在该事件中调用JS获取触发方式,创建新标签页并根据状态决定是否激活:

private async void WebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
    // 获取JS记录的触发方式
    var triggerResult = await webView.CoreWebView2.ExecuteScriptAsync("getNewWindowTrigger();");
    var trigger = triggerResult.Trim('"');

    // 创建新的WebView2实例
    var newWebView = new WebView2();
    await newWebView.EnsureCoreWebView2Async(webView.CoreWebView2.Environment);
    
    // 将新窗口绑定到事件参数
    e.NewWindow = newWebView.CoreWebView2;
    e.Handled = true;

    // 假设使用TabControl管理标签页,根据触发方式处理标签激活逻辑
    var tabItem = new TabItem
    {
        Header = "新标签页",
        Content = newWebView
    };
    tabControl.Items.Add(tabItem);

    // 左键点击则激活新标签,滚轮点击仅添加不激活
    if (trigger == "left_click")
    {
        tabControl.SelectedItem = tabItem;
    }
}

注意事项

  • 对于直接通过JavaScript调用window.open()的场景,由于没有鼠标事件触发,这里默认按左键点击处理;若需区分此类情况,可在JS中额外添加标记逻辑。
  • 使用closest('a')确保能捕获到嵌套在其他元素内的链接,提升兼容性。
  • 每次获取触发状态后立即重置newWindowTrigger,避免状态污染下一次新窗口请求。

内容的提问来源于stack exchange,提问作者Eric Nien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:46:10