Открытие ссылок во внешнем браузере в WebView (WinRT)

У меня есть компонент WebView, который я использую для отображения HTML-объявлений в своем приложении. Когда пользователь нажимает на объявление в WebView, я хочу открыть ссылку на объявление во внешнем браузере. Как я могу это сделать?

Мне нужно что-то вроде OnNavigating из браузера WP7. Я попробовал событие Tapped в WebView, но оно никогда не вызывается, даже если я установил IsTapEnabled=true. мне нужно что-то вроде


person Igor Kulman    schedule 03.10.2012    source источник


Ответы (2)


Для этого вам нужно будет использовать событие ScriptNotify. Вот как я обработал этот сценарий (используя NavigateToString). Если вы извлекаете содержимое веб-представления из URL-адреса, вам нужно будет изменить 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>
    

    Это добавляет обработчик кликов к каждой ссылке (‹a href="..."›‹/a›) на странице. window.external.notify — это метод Javascript, который работает в Webview.

  2. Добавьте обработчик событий ScriptNotify в веб-представление.

    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-адрес, его необходимо добавить в разрешенный белый список Uris веб-просмотра (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify для справки) .

person Akinwale    schedule 06.10.2012
comment
а как насчет гиперссылки на файлы? это не работает - person Jozef Cechovsky; 05.03.2015
comment
В этом случае попробуйте изменить UriKind.Absolute на UriKind.Relative. - person Akinwale; 28.07.2015
comment
Вместо того, чтобы добавлять обработчик кликов ко всем ссылкам и использовать обработчик WebView.ScriptNotify, вы можете использовать обработчик WebView.NewWindowRequested - person ndreisg; 19.12.2018

Попробуйте обработать событие 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);
        }
    }
person slobodans    schedule 06.05.2014