【问题标题】:Detect when iframe is cross-domain, then bust out of it检测 iframe 何时是跨域的,然后退出它
【发布时间】:2011-01-22 21:01:40
【问题描述】:

我有一个包含大部分内容的大型 iframe 页面。用户通过在 iframe 内单击来与网站交互。我正在尝试构建的功能是:当用户离开我的网站时,我会帮他们一个忙并退出 iframe。

iframe 有一个 onload 事件,每次加载新页面时都会触发该事件,无论是否跨域。

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe>

每次触发事件时,我都在寻找一些方法来:

A) 检测用户何时导航到不同的域

B) 退出 iframe。

我怀疑 B 是不可能的,因为浏览器不允许访问

document.getElementById("testframe").contentDocument.location.href

当 iframe 是跨域时。我也不确定A是否可能。

如果有人对如何做到这一点有想法,或者肯定无法做到,我将不胜感激。

谢谢

【问题讨论】:

    标签: javascript security iframe cross-domain


    【解决方案1】:

    您可以执行 A,因为如果您遇到安全错误(您可以捕获),这意味着它们是跨域的 :) 然后您可以将 iframe 调整为整个页面。但我认为你是对的,如果没有来自其他领域的明确合作,你实际上是无法退出的。

    编辑:你是对的,你不需要投票。这是基本代码:

    <html>
    <head>
    <title>Cross-domain frame test</title>
    <!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 -->
    <script type="text/javascript">
    function checkForCross()
    {
      var iframe = document.getElementById("myFrame");
      try
      {
        var loc = iframe.contentDocument.location.href;
      } catch(e)
      {
        iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;");
      }
    }
    </script>
    </head>
    <body>
    <iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe>
    </body>
    </html>
    

    【讨论】:

    • 我将测试 try/catch 方法。我总是忘记 JavaScript 支持这一点 :) 但轮询不是必需的,因为我可以在每次 iframe 的 onload 事件触发时对其进行测试。
    • 这绝对有效,并证明 A 是可能的。不幸的是,B 似乎仍然不可能——扩展 iframe 可以工作,但它仍然很不稳定,因为浏览器位置栏中的 url 与正在显示的站点不匹配。我将尝试使用涉及修改其他答案建议的链接的解决方案,例如为每个链接附加一个点击处理程序,检查 href 属性是否是跨域的。
    • Emmett,点击处理程序有效,但仅适用于 /your/ 链接,不适用于 iframe 中的链接。
    • 据我所知,try/catch 块并不能阻止错误出现在 Chrome 或 Safari 的错误控制台中。任何人都知道如何在这些浏览器中做 A 吗?
    • 该错误无法捕获(至少在 chrome 上)。执行继续,但对任何跨域变量的访问返回为未定义。有关代码示例,请参见下面的答案。
    【解决方案2】:

    将外部链接上的“target”属性设置为“_top”。

    【讨论】:

    • 在不跨域的情况下,您可以通过遍历 BOM 来执行此操作。
    【解决方案3】:

    这至少适用于 chrome(不适用于其他浏览器的测试器)

       if(parent.location.host != undefined){ 
           alert("hello world!");
        }else{
           throw "cannot access parent!";
        }
    

    它仍然会抛出"unsafe javascript attempt" 警告,但这不会停止代码执行。相反,该变量以未定义的形式返回。

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多