如何判断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
相关产品推荐
相关产品推荐

