我只是一个初学者,所以也许我只是不理解它。但是,当您之前使用window.onstatechange
更改状态时点击浏览器的后退/前进按钮时,History.stateObj
是不是应该触发?
我实际上看到Firebug控制台中的对象发生了变化,但window.onstatechange
只是不会发射!另外 - 非常令人困惑 - 当我使用window.onpopstate
代替时,对象不再改变(使用后退/前进按钮时)。
这就是我的所作所为:
$('.container').click(function(e) {
e.preventDefault();
var title = $(this).data('title');
stateObj = { show: title }
History.pushState(stateObj, document.title, '?show=' + title);
}
window.onstatechange = function() {
var title = History.getState().data['show'];
alert('title');
}
我已经从here发现,我必须使用
History.Adapter.bind(window,'statechange',function(){
var title = History.getState().data['show'];
alert('title');
});
......哪个有效,但我仍然不明白为什么window.onstatechange
不会开火?!
//编辑:Opened a ticket on Github
有什么建议吗?
答案 0 :(得分:0)
Lucian Poston于2012年4月在GitHub上回答了这个问题:
这似乎是History.Adapter事件模型的设计。看一下适配器的实现,例如https://github.com/balupton/history.js/blob/master/scripts/uncompressed/history.adapter.native.js
当history.js引发“ statechange”事件时,它将调用History.Adapter.trigger(),它会通过先前对History.Adapter.bind()的调用来遍历事件处理程序设置的列表。没有按预期的方式调用window.onstatechange()。
实际上,History.Adapter.bind(window,'statechange',function(){alert('oi');})设置window.onstatechange,以便如果被触发,它将调用History.Adapter.trigger(window ,“ statechange”),依次调用事件处理程序function(){alert('oi'); }。如果按照示例中的方式重新定义window.onstatechange,则会破坏该行为。