9

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

谢谢。

4

6 回答 6

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');
                        }
                    }
                })()"
            });
于 2014-11-26T09:25:01.937 回答
10

在 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.
}
于 2016-07-01T06:39:18.700 回答
1

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

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

于 2013-07-08T21:06:10.763 回答
1

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

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

要解决上述所有问题,您需要覆盖 window.open 函数并且还检查“目标”属性不是一次,而是每次用户单击某些东西时。这是涵盖这些情况的脚本:

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 事件可以更自然地解决这个问题。

于 2016-09-06T15:48:24.767 回答
0

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

可以在此处找到有关 WebViewBrush 的更多信息:http: //msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush

于 2013-07-15T18:01:32.437 回答
0

如果您可以编辑页面的 HTML 和 NavigateToString(),则在 <head> 中添加 <base target='_blank'/>

于 2013-09-04T03:29:49.557 回答