2013-03-06 126 views
1

我使用iframe来显示HTML电子邮件内容,方法是通过JS将HTML字符串写入其内容文档。如果用户点击显示的电子邮件中的链接,我不希望用户在iframe之内导航。现在,我有以下选择:防止IFrame导航

  1. 在一个新的浏览器窗口或选项卡(首选
  2. 防止所有的导航(不理想,只有在没有其他左选项)
  3. 更好的选择,我不打开链接你知道吗?

我怎么能完成这2个选项中的任何一个?

我知道HTML5推出​​财产,但遗憾的是,只有在工作和ChromeSafari,所以这不是一个选项。

+0

将所有链接转换为带有onclick事件的跨度 – 2013-03-06 22:48:59

+2

如果您正在为iframe文档编写html,您应该能够在头部添加一个元素。这将为在iframe中点击的链接打开一个新窗口或标签。 – kennebec 2013-03-07 00:06:32

+0

不知道我可以在'base'中设置一个目标。你应该发布这个答案。 – 2013-08-05 14:54:37

回答

0

您可以遍历iframe中的所有链接并将target="_blank"添加到它们。

(请原谅我,但我只知道如何联系起来的例子在这个没有它被标记的问题做到这一点在JQuery中非常抱歉):

$("#iframeID").contents().find("a").each(function() { 
    $(this).attr("target", "_blank"); 
}); 

例子:http://jsfiddle.net/yP7Nd/ - (忽略的位JS上面我的JQuery代码,我不得不这样做,以获得一些IFrame内容加载正常)。

+0

我想这是最优雅的解决方案,但最终它不会阻止通过JS触发的导航事件。也许我也应该删除所有'onclick'等事件,但我不确定如何做到这一点,如果事件处理程序是在脚本加载到iframe之后添加的。 – 2013-03-06 23:46:11

0

你应该能够与他们显示的文本,以取代所有的链接,是这样的:

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); 
} 

注意,links collection是活的,因此反向环路。

+0

这项工作将在所有浏览器上进行吗? (我问你链接的文档是Html 5,OP说他想避免这种情况)。 – webnoob 2013-03-06 23:10:15

+0

'document.links'是DOM 0,DOM方法都是版本2或更早版本,所有浏览器都是自NN或IE 5支持的。最近的是'textContent'或'innerText',但我认为任何IE 6或Firefox 1.5以上版本都应该这样做。 – RobG 2013-03-06 23:38:48

2

如果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负荷,因此在导航返回之前它会短暂闪烁新内容。另外,请注意,这会打破浏览器后退按钮。