Javascript 防止IFrame导航
我使用Javascript 防止IFrame导航,javascript,html,iframe,Javascript,Html,Iframe,我使用iframe通过JS向其内容文档中写入HTML字符串来显示HTML电子邮件内容。如果用户单击显示的电子邮件中的链接,我不希望用户在iframe中导航。现在我有以下选择: 在新浏览器窗口或选项卡中打开链接(首选) 阻止所有导航(仅当没有其他选项时为次优) 我不知道的更好的选择 我如何完成这两个选项中的任何一个 我知道HTML5引入了一个sandbox属性,但不幸的是,它只在Chrome和Safari中起作用,所以这不是一个选项。您可以循环查看iframe中的所有链接,并向它们添加target
iframe
通过JS向其内容文档中写入HTML字符串来显示HTML电子邮件内容。如果用户单击显示的电子邮件中的链接,我不希望用户在iframe
中导航。现在我有以下选择:
我知道
HTML5
引入了一个sandbox
属性,但不幸的是,它只在Chrome
和Safari
中起作用,所以这不是一个选项。您可以循环查看iframe中的所有链接,并向它们添加target=“\u blank”
(请原谅,我只知道如何在JQuery中执行此操作,因此很抱歉在问题中没有标记示例):
示例:-(忽略JQuery代码上方的JS,我必须这样做才能正确加载一些IFrame内容)。您应该能够用显示的文本替换所有链接,例如:
var links = document.links;
var i = links.length;
var link, text, node;
while (i--) {
link = links[i];
text = link.textContent || link.innerText || '';
node = document.createTextNode(text);
link.parentNode.replaceChild(node, link);
}
请注意,是活动的,因此是反向循环。如果iframe来自不同的原点,此方法将通过重置iframe源来阻止导航,如果它发生变化:
var $iframe = $('iframe');
var iframeUrl = 'http://example.com/foo';
var iframeLoaded = false;
$iframe.on('load', function () {
if (!iframeLoaded) { # Allow initial load of iframe.
iframeLoaded = true;
return;
}
# Reset iframe location back to original source to prevent navigation.
iframeLoaded = false;
$iframe[0].src = iframeUrl;
});
不幸的是,无法检测iframe加载的开始,因此它将在返回之前短暂地刷新新内容。另外,请注意,这将断开“浏览器后退”按钮。对于iframe所在的页面,请定义一个限制返回特定源(如域)的。仅供参考,这不适用于Internet Explorer。下面是一个相关的。使用onclick事件将所有链接转换为span如果您正在为iframe文档编写html,您应该能够在头部添加元素。这将为在iframe中单击的链接打开一个新窗口或选项卡。我不知道我可以在
base
中设置目标。您应该将此作为答案发布。IE10+和所有主要浏览器现在都支持iframes的sandbox属性:这对所有浏览器都有效吗?(我问你,因为你链接的文档是HTML5,OP说他想避免这种情况)。document.links
是DOM 0,DOM方法都是2版或更早版本,因为所有浏览器都支持这些。最新的解决方案是textContent
或innerText
,但我认为IE 6或Firefox 1.5以后的任何东西都应该这样做。我想这是最优雅的解决方案,但最终它不会阻止通过JS触发的导航事件。也许我也应该删除所有的onclick
等事件,但是如果在iframe中加载脚本之后添加了事件处理程序,我不确定该如何做。
var $iframe = $('iframe');
var iframeUrl = 'http://example.com/foo';
var iframeLoaded = false;
$iframe.on('load', function () {
if (!iframeLoaded) { # Allow initial load of iframe.
iframeLoaded = true;
return;
}
# Reset iframe location back to original source to prevent navigation.
iframeLoaded = false;
$iframe[0].src = iframeUrl;
});