是否可以在不调用hashchange事件的情况下更改页面的哈希?

就像在我的应用程序中一样,我想要执行以下操作:

$(window).hashchange( function(){

    hash = ...; // here I change the hash to something else

    window.location.hash = hash; // then update it

});

上面代码的明显问题是,它将导致循环,因为window.location.hash将调用hashchange事件,然后依次类推。

但是在我的应用程序中,我仅在以下条件下更改哈希值:
$(window).hashchange( function(){

    var hash = window.location.hash;

    var lastChar = hash.substr(-1);

    if(lastChar != '/') {

        // Add trailing slash
        hash = hash.replace(/\/?$/, '/');

        // Update the hash
        window.location.hash = hash;

    }

});

因此,只有在找不到尾部斜杠的情况下才调用它,然后将其添加后就不会再输入条件了,因此不会发生上述循环问题。

但仍然会调用hashchange事件! ,由此产生两个问题:
  • 由于上一页是当前页面,并且浏览器卡在了当前页面的无限堆栈中,因此历史记录被破坏了。
  • 我在hashchange上的应用程序中执行了AJAX请求,因此它将两次执行调用,只是添加了末尾的斜杠。

  • 是否可以在不调用事件的情况下将斜杠添加到哈希中?

    也许做window.unbind('hashchange')。那行得通吗?并且还需要在HTML4浏览器中工作,因此此处不是HTML5历史记录API的选项。

    最佳答案

    在HTML5浏览器中,可以使用window.history.replaceState()来更新哈希,而不会导致创建新的历史记录条目。

    根据MDN docs.pushState().replaceState()都不会触发hashchange事件。

    10-08 15:06