history.js window.onstatechange不会触发

时间:2011-12-14 10:43:41

标签: javascript pushstate history.js

我只是一个初学者,所以也许我只是不理解它。但是,当您之前使用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

有什么建议吗?

1 个答案:

答案 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,则会破坏该行为。