在Safari中,如果存在iframe加载,并且用户通过返回或转发更改历史记录状态,则不会触发popstate事件,从而导致应用程序状态和窗口位置不同步.
我认为一个活跃的XHR请求会导致相同的行为,但我还没有确认.
您只需按顺序单击链接/按钮,从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事件.)