【问题标题】:WebView2 - intercept and prevent/cancel anchor navigationWebView2 - 拦截和阻止/取消锚导航
【发布时间】:2022-08-22 18:48:28
【问题描述】:

在我的 WinForms 应用程序中,我使用 WebView2 来显示第三方内容。 当用户单击 webView 内的链接(或其他导航元素)时,目标链接应在默认浏览器中打开(而不是在 webView 中)。 在大多数情况下,我能够使用NewWindowRequestedNavigationStarting 事件实现所需的行为。 但是对于当前页面 (<a href=\"#my_anchor\">) 内的锚导航,这些事件不会触发。

有一个SourceChanged 事件,在锚导航时触发,它甚至允许通过检查IsNewDocument 来确定这是in-page 导航,但它不允许取消导航。

我正在考虑基于 js 的解决方案,例如为所有 a 标签甚至整个 document 订阅 click 事件并进行进一步过滤。但我意识到这样的解决方案在许多重要的情况下都行不通,包括

  • 动态创建a元素
  • 键盘导航(TAB 选择链接,Enter 启动操作,所以没有click 事件)
  • a 元素内部有很多元素(img 等)并且用户单击此类内部元素的情况
  • 当使用 js 启动导航时

那么,是否存在处理和取消 任何导航,包括当前页面中的锚点?

    标签: c# winforms webview2


    【解决方案1】:

    我也有同样的要求。我正在使用 Win32 C++,对我来说,NewWindowRequested 事件确实会在锚导航上触发,我添加了这个实现来取消默认行为并在默认浏览器中打开 Uri...

    // Register a handler for the NewWindowRequested event.
    CHECK_FAILURE(m_webView->add_NewWindowRequested(
        Callback<ICoreWebView2NewWindowRequestedEventHandler>(
            [this](ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args) {
    
                // get the target Uri
                LPWSTR sUri;
                CHECK_FAILURE(args->get_Uri(&sUri));
    
                // and if it was user initiated (e.g. click on an anchor tag)
                BOOL bUserInit;
                CHECK_FAILURE(args->get_IsUserInitiated(&bUserInit));
    
                if (bUserInit) {
                    // cancel default behaviour
                    args->put_Handled(TRUE);
    
                    // and open Uri in default browser
                    ShellExecute(0, 0, sUri, 0, 0, SW_SHOW);
                }
    
                return S_OK;
            })
        .Get(), nullptr));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多