防止历史传播到父窗口

我有2个简单的HTML页面:父母和孩子。 Parent将子项存储在iframe
Parent.html:

<html>
<head></head>
<body>

<input type="text" id="text" />
<input type="button" value="change hash" onclick="javascript:changeHash()" />

<iframe src="Child.html"></iframe>

<script type="text/javascript">
    function changeHash () {
        window.location.hash = document.getElementById('text').value;
    }
</script>

</body>
</html>

和Child.html:

<html>
<head></head>
<body>

<input type="button" value="go back" onclick="javascript:goBack()" />

<script type="text/javascript">
    function goBack () {
        this.history.back();
    }
</script>

</body>
</html>

我使用改变哈希按钮来添加几个哈希到历史记录。 当我按下iframe 返回按钮时 - 父页面的哈希值被更改。 似乎这是规范的行为。

所以问题是:是否有可能阻止从iframe返回到它的父页面? 所以我希望iframe不要改变父母的历史/散列。

注意:相同的行为是用于go功能的(实际上, go(-1)back()相同)。


我认为不可能使用框架来做到这一点,但我有一个可能(部分)解决这个问题的解决方案。

首先,我想改变对象history并重新定义它,但是这是不可能的,因为它是窗口内不可写的属性。 但我们可以重新定义history的功能。

这导致我重新定义了函数back() ,而不是让history对象完成他的工作,我们必须找到以前的url并更改文档(child)的位置。

在你的Child.html ,像这样重新定义函数back()

history.back = function ()
{
    document.location = document.referrer;
}

我们在这个函数中遇到的问题是,一旦父文档被加载并且iframe(子)也被加载,那么子代的document.referrer将返回父代的url

因此,在更改document.location之前,让我们来测试document.referrer是否与父级的url不同(witout anchor)

history.back = function ()
{
    var url = window.parent.document.location.href.split("#")[0];
    if(document.referrer!=url)
        document.location = document.referrer;
}

最后,这是我找到的解决方案,不幸的是它有一个问题,就是你无法重新定义forward()函数,它允许你转到下一个url,不可能找到下一个url, document.referrer返回您来自的网页的网址,可能是上一页或下一页。 但仍然可以在iframe中导航,无需更改父级位置。

链接地址: http://www.djcxy.com/p/22129.html

上一篇: Prevent history propagation to the parent window

下一篇: Can I get the OWIN cookie and decrypt it to get claims from it in BeginRequest?