防止iframe破坏会杀死网站上的所有链接

时间:2012-07-27 18:04:52

标签: javascript iframe

我在下面有这个脚本,这可以防止iFrame破坏,但它也会杀死我页面上的每个链接。如何阻止脚本禁用我的所有链接?

<script>
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
        if (prevent_bust > 0) {  
            prevent_bust -= 2  
            // 204 header response prevents redirect
            window.top.location = '/204-response'  
        }  
    }, 1)  
</script>

我遇到的问题完全如此处所述:http://slightlyparanoid.com/?p=11

2 个答案:

答案 0 :(得分:1)

编辑:你有没有理由使用这种方法来制作框架?普遍接受的方法是比较self === top,我非常怀疑会破坏任何锚标记:

if (self !== top) {
    // this script is running in an iframe
} else {
    // this script is not running in an iframe
}

这很可能影响IE(docs):

  • 单击引用其他文档的锚点。
  • 调用anchor.click方法。

要允许onbeforeunload事件继续而不干扰锚标记点击,您必须从中返回undefined

window.onbeforeunload = function() { 
    prevent_bust++; 
    return undefined; 
};

为了澄清,onbeforeunload期望一个字符串从处理程序返回,然后它将在一个确认框中抛出。如果您返回undefined,则会绕过此值并继续unload事件。

答案 1 :(得分:0)

到目前为止,禁用帧无效的最佳方法是sandbox,但您可能会在测试中发现
这种方法有一些缺点。

但是,204代码会禁用所有浏览器导航(所有链接,后退,前进等)。
但是,某些浏览器 已经恢复了前进和后退按钮,但仍然没有链接导航,因此将其应用于代码可能不是最好的主意,您是否尝试过将'/ 204-response'添加到
iframes源(src属性)?

在这里,跨框架嵌入是一个问题,但是像我说的那样,沙盒规则只能在一定程度上起作用。

因此,让sandbox属性生效,让我们知道它的工作原理!
(显然,这种情况是特定于每种情况的,但这是一种很好的通用方法。)