只跟踪IFRAME历史(Track only iframe history)

2019-06-24 18:25发布

我有一个包含一个iframe页面,我只希望跟踪iframe的历史。 我试图用历史的对象是这样的:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script type="text/javascript">
        function checkFrameHistory() {
            alert(window.frames["test2"].history.length);
        }

        function checkThisHistory() {
            alert(history.length);
        }
        </script>
    </head>
    <body>

        <iframe name="test2" src="test2.html"></iframe>

        <div>
            <input type="button" onclick="checkFrameHistory()" value="Frame history"/>
            <input type="button" onclick="checkThisHistory()" value="This history"/>
        </div>

    </body>
</html>

test2.html

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script type="text/javascript">
        function checkMyHistory() {
            alert(history.length);
        }
        </script>
    </head>
    <body>
    <div>
        Test2
    </div>

    <div>
        <input type="button" onclick="checkMyHistory()" value="My history"/>
    </div>

    </body>
</html>

但它实际上给我的历史,包括父窗口。

举例来说,我到另一个网站在主窗口中,回到了我的iframe的试验场。 无论window.frames["test2"].history.lengthhistory.length仍然由2增加长度给了我同样的计数。

难道我错了? 有没有办法只跟踪的iframe历史?

Answer 1:

有一个简单的方法来做到这一点,当然前提是iframe中的内容是相同的域。

从父绑定到beforeUnloadload iframe的window对象的事件。 在事件的回调处理器,你根本就沿着线的东西locations.push(getElementById("iframe").contentWindow.location.href)其中地点当然是在父范围先前定义的数组。



Answer 2:

Chrome的管理上的窗口基地的历史; 未在单独的帧。 这种行为很可能是你的问题的原因。

不知道如果所有的浏览器的默认行为BTW。

编辑:你必须保持你的navigationhistory服务器端。 保持在主窗口的阵列,在另一个答案说,不工作的时候,你还与父窗口导航。



Answer 3:

使用这个访问iframe的历史

document.getElementById("test2").contentWindow.history.length


Answer 4:

这是不太可能,你将能够访问与因的帧相关的任何物品同源策略 。

你有没有尝试设置域在页面本身的iframe平等? 例如

//somewhere on your page in a script tag
document.domain = "your-top-level-domain.com";

这应该发信号给浏览器的页面相互信任,应给予进入其内部状态



Answer 5:

如果帧包含contentWindow,您可以使用frame.contentWindow.history。

但并不是所有的浏览器都支持此属性。 如果不是,则帧的位置应该存储在一些变量。 在你的框架onload事件绑定的事件处理程序如下图所示(使用jquery)

var frameHistory = [];
$(document).ready(function(){
    var frame = window.frames["test2"];
    $.bind(frame, "onload", function(){ //store location when frame loads
        frameHistory.push(frame.window.location.href);
    }
});

而在你点击链接事件处理程序:

alert(frameHistory.length);


Answer 6:

只要你有机会获得两个域及其可能击败SOP。 您可以使用一个辅助IFRAME从身体传递的onchange事件。

:该邮件应该是非常有帮助的基于内容调整大小的iframe



文章来源: Track only iframe history