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


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

Спасибо.

6 9

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 (), то добавьте в