如何禁止WebView在WinRT中打开浏览器上的链接(target = _blank links)?

时间:2013-07-02 18:17:05

标签: c# webview windows-runtime target

我的应用程序上有一个WebView,我无法更改html文件(“target = _blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。我怎么能禁止这个动作?

感谢。

6 个答案:

答案 0 :(得分:10)

在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');
                        }
                    }
                })()"
            });

答案 1 :(得分:8)

在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.
}

答案 2 :(得分:1)

有导航开始事件。它有一个取消属性,可用于取消导航。也许这对你有用吗?

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

答案 3 :(得分:1)

最近我自己偶然发现了这一点,我想补充一点,尽管user2269867's回答是可行的解决方案,但在某些情况下它可能不起作用。

例如,系统浏览器不仅会在用户单击带有target =“_ blank”属性的链接时打开,而且还会在javascript中调用window.open()函数时打开。此外,如果页面动态加载某些内容并在脚本执行完毕后更改DOM,那么即使删除所有“目标”属性也不会起作用。

要解决上述所有问题,您需要覆盖window.open函数,并且还要检查'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 mentioned,对于Windows 10,有WebView.NewWindowRequested事件可以更自然地解决这个问题。

答案 4 :(得分:0)

如果您只想显示该页面而不允许在该页面上执行任何操作,我会查看WebViewBrush。 WebViewBrush将基本上截取网站,用户将无法使用该页面上的任何链接或任何其他内容,它将变为只读页面。我相信这就是你要求的。

有关WebViewBrush的更多信息,请访问:http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush

答案 5 :(得分:0)

如果您可以编辑页面的HTML和NavigateToString(),则添加&lt; base target ='_ blank'/&gt;在&lt; head&gt;