3

我只是一个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');
}

我已经从这里发现,我必须使用

History.Adapter.bind(window,'statechange',function(){
            var title = History.getState().data['show'];
            alert('title');

});

...这行得通,但我还是不太明白为什么window.onstatechange不开火?!

// 编辑:在 Github 上打开了一张票

有什么建议么 ?

4

1 回答 1

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,它将破坏该行为。

于 2019-12-10T11:19:08.620 回答