【问题标题】:Open links in external browser in WebView (WinRT)在 WebView (WinRT) 的外部浏览器中打开链接
【发布时间】:2012-09-24 02:21:08
【问题描述】:

我有一个 WebView 组件,用于在我的应用中显示 HTML 广告。当用户单击 WebView 中的广告时,我想在外部浏览器中打开广告链接。我该怎么做?

我需要像 WP7 浏览器中的 OnNavigating 之类的东西。我尝试了 WebView 的 Tapped 事件,但即使我设置 IsTapEnabled=true,它也不会被调用。我需要类似的东西

【问题讨论】:

    标签: c# xaml microsoft-metro windows-runtime winrt-xaml


    【解决方案1】:

    您需要为此使用 ScriptNotify 事件。这是我处理场景的方式(使用 NavigateToString)。如果您要从 URL 中检索 Web 视图内容,则需要能够修改 HTML 以使其正常工作。

    1. 将以下 Javascript 代码添加到您的 HTML 中

      <script type="text/javascript">for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify('LaunchLink:' + this.href); return false; } }</script>
      

      这会为页面上的每个链接 () 添加一个 onclick 处理程序。 window.external.notify 是一种在 Webview 中工作的 Javascript 方法。

    2. 将 ScriptNotify 事件处理程序添加到 webview。

      WebView.ScriptNotify += WebView_ScriptNotify;
      
    3. 声明事件处理程序

      async private void WebView_ScriptNotify(object sender, NotifyEventArgs e)
      {
          try
          {
              string data = e.Value;
              if (data.ToLower().StartsWith("launchlink:"))
              {
                  await Launcher.LaunchUriAsync(new Uri(data.Substring("launchlink:".Length), UriKind.Absolute));
              }
          }
          catch (Exception)
          {
              // Could not build a proper Uri. Abandon.
          }
      }
      

    请注意,如果您使用的是外部 URL,则必须将其添加到 webview 的允许 Uris 白名单(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify 供参考)。

    【讨论】:

    • 但是文件的超链接呢?这不起作用stackoverflow.com/questions/28886198/…
    • 在这种情况下,尝试将 UriKind.Absolute 更改为 UriKind.Relative
    • 您可以使用WebView.NewWindowRequested 处理程序,而不是向所有链接添加点击处理程序并使用WebView.ScriptNotify 处理程序
    【解决方案2】:

    尝试处理 NavigationStarting 事件。 在这里您可以拦截和取消 URL 的加载。 您可以过滤在网页视图中打开哪个链接,以及在默认浏览器中打开哪个链接。

    private async void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
        {
            if(null != args.Uri && args.Uri.OriginalString == "URL OF INTEREST")
            {
                args.Cancel = true;
                await Launcher.LaunchUriAsync(args.Uri);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-12
      • 2018-02-11
      • 2017-08-06
      • 1970-01-01
      • 2015-12-09
      • 2019-11-23
      • 2021-05-21
      • 2021-06-12
      相关资源
      最近更新 更多