我的应用程序上有一个 WebView,我无法更改 html 文件(“target=_blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。如何禁止此操作?
谢谢。
我的应用程序上有一个 WebView,我无法更改 html 文件(“target=_blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。如何禁止此操作?
谢谢。
在 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.
}
有一个导航开始事件。它有一个可用于取消导航的取消属性。也许这对你有用?
我自己最近偶然发现了这个,我想补充一点,即使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 事件可以更自然地解决这个问题。
如果您只想显示页面并且不允许在该页面上执行任何操作,我会查看 WebViewBrush。WebViewBrush 基本上会截取网站,用户将无法使用该页面上的任何链接或其他任何内容,它将变成只读页面。我相信这就是你所要求的。
可以在此处找到有关 WebViewBrush 的更多信息:http: //msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush
如果您可以编辑页面的 HTML 和 NavigateToString(),则在 <head> 中添加 <base target='_blank'/>