我的应用程序上有一个WebView,我无法更改html文件(“target = _blank”链接类型)。但是页面上的一些链接使我的应用程序在系统浏览器上打开它们。我怎么能禁止这个动作?
感谢。
答案 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)
有导航开始事件。它有一个取消属性,可用于取消导航。也许这对你有用吗?
答案 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;
中