【问题标题】:Opera 11.50+ implementation of history.replaceState()Opera 11.50+ history.replaceState() 的实现
【发布时间】:2012-01-10 16:46:15
【问题描述】:

考虑这个 jsfiddle:http://fiddle.jshell.net/maple/JbEJN/show/(这是结果窗口,为了让 replaceState 工作,请参阅 actual fiddle with code here: http://jsfiddle.net/maple/JbEJN/)。

这是一个简单的 javascript 选项卡控件。我单击“Tab 1”并查看一个 div 的内容。我单击“选项卡 2”以隐藏正在显示的 div 并显示另一个具有不同内容的 div。你得到钻,标准选项卡控件。

现在,我要做 想要的是使用主题标签来为页面添加书签或链接到选定的某个选项卡。我想要的是每次在标签之间切换时创建一个浏览器历史记录条目,这样当我按下返回时,我必须在 10 个标签之间循环,然后才能真正返回到我来的页面来自。

我打算实现这一点的方式是,当我在选项卡之间切换以将主题标签插入页面的 url 时使用 replaceState(),如下所示:

window.history.replaceState(null, '', '#tabname');

我希望在这里发生的是,在选项卡之间切换时不会创建任何历史记录条目,所以当我在选项卡之间切换几次时,我会看到井号发生变化,但是当我点击后退按钮时,我只是回到上一个页面(如果我在新窗口中打开测试页面,则什么也不会发生)。

这适用于 Chrome、Firefox 和 Safari,但不适用于 Opera 11.50 和 11.60。据我所知,Opera 声称完全支持 Opera 中的历史 API,但在 Opera 中发生的情况是 replaceState() 的工作方式与 pushState() 类似,条目会被放入历史记录中。

这是 Opera 中的错误,还是我应该在 Opera 中以其他方式使用 API?

【问题讨论】:

    标签: javascript opera browser-history


    【解决方案1】:

    我猜这里发生的事情是点击事件的默认操作是激活链接 - 所以在您调用 replaceState() 之后,默认操作将更新 URL、添加#tabname 并创建一个历史条目。尝试使用event.preventDefault()http://jsfiddle.net/JbEJN/8/show/

    我不确定为什么您的原始代码可以在 Chrome 和 Firefox 中按预期工作。如果 replaceState() 已经更新了 URL 并且链接的激活不会改变它,他们大概不会创建历史条目?如果是这样,Opera 可能应该更改以匹配它们。您能否在 https://bugs.opera.com/wizard/ 上将此问题报告为问题?如果您给我错误参考 ID,我会跟进。

    【讨论】:

    • 你是对的,添加 event.preventDefault() 修复了 Opera 中的问题(并且在其他浏览器中保持不变)。我提交了一个错误,它的 id 是 DSK-355229。
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 2016-10-18
    • 2012-10-01
    • 2013-01-14
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多