【发布时间】:2011-05-17 20:58:01
【问题描述】:
在 Safari 中,如果加载了 iframe,并且用户通过后退或前进更改历史状态,则不会触发 popstate 事件,导致应用程序状态和窗口位置不同步.
我认为活动的 XHR 请求会导致相同的行为,但我还无法确认。
这是一个 jsfiddle,可让您轻松重现该问题: http://jsfiddle.net/neonsilk/muHk8/
您只需按从 1 到 6 的顺序单击链接/按钮。
在 Safari 5.0.5 中,输出为:
(按时间倒序,重要的部分是顶部的状态比较)
[1305665493096] /
[1305665493096] vs
[1305665493096] /node
---------------
[1305665489955] iframe loaded
---------------
[1305665489806] (did popstate or $.address change trigger?)
[1305665489805] called history.back()
[1305665489805] appended iframe
---------------
[1305665488428] popstate: /node
[1305665488427] $.address change: /node
---------------
[1305665487821] popstate: /
[1305665487821] $.address change: /
---------------
[1305665487179] $.address change: /node
---------------
[1305665486606] $.address change: /
---------------
[1305665485732] iframe loaded
---------------
[1305665485569] $.address change: /neonsilk/muHk8/show/
[1305665485568] $.address init
然而在 Chrome (11) 或 FireFox (4.0) 中,输出看起来像:
(注意状态是同步的)
[1305665609499] /
[1305665609499] vs
[1305665609499] /
---------------
[1305665608360] iframe loaded
---------------
[1305665607770] popstate: /
[1305665607770] $.address change: /
[1305665607758] (did popstate or $.address change trigger?)
[1305665607758] called history.back()
[1305665607758] appended iframe
---------------
[1305665606870] popstate: /node
[1305665606869] $.address change: /node
---------------
[1305665606150] popstate: /
[1305665606149] $.address change: /
---------------
[1305665605551] $.address change: /node
---------------
[1305665604808] $.address change: /
---------------
[1305665603354] iframe loaded
---------------
[1305665602688] $.address change: /neonsilk/muHk8/show/
[1305665602682] $.address init
[1305665602676] popstate: /neonsilk/muHk8/show/
这是 Safari 中的错误吗?如果是,是否有人发现了解决方法?
(有趣的是,FireFox 和 Chrome 在页面加载时都会触发 popstate 事件。)
【问题讨论】:
标签: javascript html safari history