我有一个<select>标签。在更改所选项目时,一些<div>s 会通过以下功能使用 AJAX 进行更新:   update_div1, update_div2, update_div3. 管理此操作的代码如下并且运行良好:
$('select.select-x').change(function(e) {
    e.preventDefault(); 
    var value = $('select.select-x option:selected').val(); 
    var text = $('option:selected').text();
    update_div1(value); 
    update_div2(value);
    update_div3(value);
    manage_history(value,text);
    return false;
});
问题在于manage_history负责管理浏览器历史记录的最后一个功能。在这个函数中,我使用 history.js 将浏览器状态推送到历史堆栈中。我在阅读了许多关于 history.js 的 SO 文章后知道,后退和前进按钮的操作应该包含在History.Adapter.bind(). 问题是浏览器的后退按钮有奇怪的行为:它们History.Adapter.bind()多次执行里面的函数,精确到我已经有一个 onChange 事件通过<select>.
的代码manage_history是:
function manage_history(str,str2)
{
    var History = window.History;
    if ( !History.enabled ) { return false; }
    var path = 'http://localhost/enc/?p='+str;
    History.pushState({myid:str},str2,path);
    History.Adapter.bind(window,'statechange',function() { 
        var State = History.getState();
        update_div1(State.data.myid); fter
        update_div2(State.data.myid);
        update_div3(State.data.myid);
    }); 
} 
我希望我很清楚。感谢您的帮助。
脑贡献后的整体解决方案:
$('select.select-x').change(function(e) {
    e.preventDefault(); 
    var value = $('select.select-x option:selected').val(); 
    var text = $('option:selected').text();
    manage_history(value,text);
    return false;
});
History.Adapter.bind(window,'statechange',function() { // Note:  Using statechange instead of popstate
        var State = History.getState();
            update_div1(value); 
        update_div2(value);
            update_div3(value);
    }); 
function manage_history(str,str2)
{
    var History = window.History;
    if ( !History.enabled ) { return false; }
    var path = 'http://localhost/enc/?p='+str;
    History.pushState({myid:str},str2,path);
        update_div1(State.data.myid); 
        update_div2(State.data.myid);
            update_div3(State.data.myid);
}