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