Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何禁止WebView在WinRT中打开浏览器上的链接(目标=\u空白链接)?_C#_Webview_Windows Runtime_Target - Fatal编程技术网

C# 如何禁止WebView在WinRT中打开浏览器上的链接(目标=\u空白链接)?

C# 如何禁止WebView在WinRT中打开浏览器上的链接(目标=\u空白链接)?,c#,webview,windows-runtime,target,C#,Webview,Windows Runtime,Target,我的应用程序上有一个WebView,无法更改html文件(“target=\u blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。我怎么能不允许这种行为 谢谢。有一个导航启动事件。它有一个cancel属性,可用于取消导航。也许这对你有用 如果您只想显示页面,而不允许在该页面上执行任何操作,我会查看WebViewBrush。WebViewBrush将基本上截图该网站,用户将无法使用该页面上的任何链接或任何其他内容,它将变成只读页面。我相信这就是你的要求 有关WebV

我的应用程序上有一个WebView,无法更改html文件(“target=\u blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。我怎么能不允许这种行为


谢谢。

有一个导航启动事件。它有一个cancel属性,可用于取消导航。也许这对你有用


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


有关WebViewBrush的更多信息可在此处找到:

如果您可以编辑页面的HTML和NavigateToString(),则在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');
                        }
                    }
                })()"
            });
webView.InvokeScriptAsync(“eval”,新[]
{
@“(职能()
{
var hyperlinks=document.getElementsByTagName('a');
对于(var i=0;i
在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.
}

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

例如,系统浏览器不仅会在用户单击带有target=“\u 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,对于Windows 10,有一个WebView.NewWindowRequested事件可以更自然地解决此问题。

此事件仅适用于Windows 8.1预览。对此,我深表歉意。我刚才查看了WebView控件,没有看到任何挂钩。也许你可以做些骇人的事?你只是想禁用链接?也许可以在iframe中加载网页,并使用一些javascript来禁用所有链接。循环页面上的ACHOR并将其onclicks设置为返回false。WebView有这个InvokeScript方法,但它看起来只是用于调用页面上的现有函数,而您不能只注入任何代码。不过,构建一些html并使用NavigateToString方法应该是直截了当的,只有在WebView内部导航时才会调用Starting事件。任何请求新窗口的链接都不会得到通知,而且用户可以根据自己的意愿在网站上导航。问题是,该站点在另一个选项卡上有一些链接要打开,这会导致应用程序调用浏览器。我需要阻止它在不更改html的情况下调用浏览器。在测试此解决方案后,我发现有时您还禁用CSS和必须使用主要web内容处理的外部文件。效果非常好!谢谢嘿好朋友!谢谢,成功了。只是在webView之前添加了Wait keywork并使事件异步,它工作得非常完美。