我有一个包含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.length
和history.length
都通过将长度增加2来给我相同的计数。
我做错了吗?有没有办法只跟踪iframe历史记录?
答案 0 :(得分:4)
有一种简单的方法可以做到这一点,前提是iframe内容是同一个域。
从父级绑定到iframe窗口对象的beforeUnload
或load
事件。在事件的回调处理程序中,您只需执行locations.push(getElementById("iframe").contentWindow.location.href)
行,其中位置当然是父作用域中先前定义的数组。
答案 1 :(得分:4)
Chrome管理窗口基础上的历史记录;不在单独的框架上。这种行为可能是您遇到问题的原因。
不知道所有浏览器的默认行为是否为btw。
编辑:您必须维护您的navigationhistory服务器端。如同另一个答案中所述,在主窗口上保持一个数组,当您也使用父窗口导航时,它不起作用。
答案 2 :(得分:3)
使用它来访问iframe的历史记录
document.getElementById("test2").contentWindow.history.length
答案 3 :(得分:1)
由于same-origin policy,您不太可能访问与该帧关联的任何对象。
您是否尝试过在页面本身和iframe上设置域名相同? e.g。
//somewhere on your page in a script tag
document.domain = "your-top-level-domain.com";
这应该向浏览器发出信号,表明页面彼此信任并且应该被授予访问其内部状态的权限
答案 4 :(得分:0)
如果框架包含 contentWindow ,您可以使用 frame.contentWindow.history 。
但并非所有浏览器都支持此属性。如果不是,则帧的位置应存储在某些变量中。 在你的frame 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);
答案 5 :(得分:0)
ITS可能就可以击败SOP。您可以使用帮助程序IFRAME从BODY传递更改事件。
这篇文章应该非常有用: Resizing an iframe based on content