Как я могу запретить WebView открывать ссылки в браузере в WinRT (target= blank links?

У меня есть WebView в моем приложении, и я не могу изменить html-файл (типы ссылок"target=_blank"). Но некоторые ссылки на странице заставляют мое приложение открывать их в системном браузере. Как я могу запретить это действие?

спасибо.

6 ответов


в обработчике событий NavigationCompleted запустите этот скрипт:

webView.InvokeScriptAsync("eval", new[]
            {
                @"(function()
                {
                    var hyperlinks = document.getElementsByTagName('a');
                    for(var i = 0; i < hyperlinks.length; i++)
                    {
                        if(hyperlinks[i].getAttribute('target') != null)
                        {
                            hyperlinks[i].setAttribute('target', '_self');
                        }
                    }
                })()"
            });

в Windows 10 вы можете использовать WebView.NewWindowRequested:

private void WebView1_NewWindowRequested(
    WebView sender,
    WebViewNewWindowRequestedEventArgs args)
{
    Debug.WriteLine(args.Uri);
    args.Handled = true; // Prevent the browser from being launched.
}

существует событие запуска навигации. Он имеет свойство cancel, которое можно использовать для отмены навигации. Может, это сработает?

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.navigationstarting


недавно наткнулся на это сам, и я хочу добавить, что хотя user2269867 это ответ является жизнеспособным решением, он может не работать в определенных ситуациях.

например, системный браузер откроется не только, если пользователь нажмет ссылку с атрибутом target="_blank", но и если окно.функция open () вызывается в javascript. Более того, даже удаление всех атрибутов "target" не будет работать, если страница загружает некоторый контент динамически и меняет DOM после вашего скрипта уже закончил работу.

чтобы решить все проблемы выше, вам нужно переопределить окно.откройте функцию, а также проверьте атрибут "target" не один раз, но каждый раз, когда пользователь нажимает что-то. Вот скрипт, который охватывает эти случаи:

function selfOrParentHasAttribute(e, attributeName) {
    var el = e.srcElement || e.target;

    if (el.hasAttribute(attributeName)) {
        return el;
    }
    else {
        while (el = el.parentNode) {
            if (el.hasAttribute(attributeName)) {
                return el;
            }
        }
    }

    return false;
}

var targetAttributeName = "target";

document.addEventListener("click", function (e) {
    var el = selfOrParentHasAttribute(e, targetAttributeName);

    if (el) {
        if ((el.getAttribute(targetAttributeName) == "_blank") ||
            (el.getAttribute(targetAttributeName) == "_new"))
        {
             el.removeAttribute(targetAttributeName);
        }
}
});


window.open = function () {
    return function (url) {
        window.location.href = url;
    };
}(window.open);

мои навыки js не идеальны, поэтому не стесняйтесь изменять. Также не забывайте, что, как kiewic указано, для Windows 10 есть WebView.NewWindowRequested событие, которое решает эту проблему более естественным.


Если вы просто хотите показать страницу и не разрешать никаких действий на этой странице, Я бы посмотрел в WebViewBrush. WebViewBrush будет в основном скриншот веб-сайта, и пользователи не смогут использовать какие-либо ссылки или что-либо еще на этой странице, он превратится в страницу только для чтения. Я верю, что это то, о чем вы просите.

более подробную информацию о WebViewBrush можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush


Если вы можете редактировать HTML страницы и NavigateToString (), то добавьте в