5

我有一个包含 iframe 的页面。iframe 可以接受用户的输入(通过按钮单击或菜单选择)并相应地显示内容。我需要的是,当用户操作 iframe 时,浏览器会将每组 iframe 参数推送到历史记录中;当用户点击后退按钮时,iframe 将使用上一个历史条目中保存的参数重新加载其内容。我有一段代码进行重新加载,如下所示。

奇怪的是,当我在 iframe 上进行多个设置时(因此多个状态条目添加到历史记录中),然后单击返回,它会像这样工作,

假设我在历史上有状态 4、3、2,而我现在处于状态 5

  1. 第一次单击恢复到状态 4(打印“----state changed----”日志消息
  2. 第二次单击会使用默认内容重新加载 iframe。不打印“----state changed----”;不调用重新加载代码。
  3. 第三次点击恢复到状态3
  4. 第四次点击就像第二次点击
  5. 第 5 次单击恢复到状态 2

所以每次点击成功恢复状态后,需要两次点击才能触发 popstate 事件(我也尝试过 statechanged 事件,结果相同)并恢复到另一个先前的状态。

有人知道这里发生了什么吗?提前致谢。

History.Adapter.bind(window, "popstate",
    function (event) {
        console.log("----state changed------", History.getState());   
        console.log("----state data------",History.getState().data.state);  

           //code to do reload an iframe to its proper state

    }); 
4

2 回答 2

4

所以我偶然发现了同样的问题。我们的情况是使用更新history.pushState()URL,然后更改. 通过更改 的,我们隐含地告诉浏览器添加 iframe 已更改的历史记录。因此...src<iframe>src<iframe>

  1. 当我们第一次按下时,window.history在 src 属性上触发了 popstate<iframe>并恢复到之前的状态。
  2. 再次按下会触发popstate您最初压入堆栈的状态的事件

我们的解决方案涉及到,当我们决定更新 URL 并将状态推送到堆栈时,当我们想要更新 时<iframe>,我们使用 jQuery 替换<iframe>列表,所以......

$("#iFrameID").replaceWith(('<iframe id="iFrameID" src="' + location + '"></iframe>'

<iframe>通过这样做,我们消除了浏览器历史记录因更新标签而受到污染的副作用。

于 2014-01-09T22:10:46.630 回答
0

我遇到了同样的问题。不是将用户导航到网站上的上一页,而是后退按钮将用户导航到 iframe 内的上一页。下面的代码将帮助您解决问题:

iframe.contentWindow.location.replace(href)
于 2015-08-14T15:16:52.027 回答