2014-02-14 55 views
2

是否可以在不调用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; 

    } 

}); 

因此,它只能被调用IF尾随斜线没有找到,然后一旦它加入它,然后它不会再次输入条件,这样就不会发生上面提到的循环问题。

但它仍然会调用hashchange事件!从现在起,当和两个问题:因为以前的页面是当前页和浏览器卡在当前页面的无限堆栈

  1. 历史被打破。

  2. 我在我的应用程序中对hashchange做了一个AJAX请求,所以它会做两次调用来添加结尾的斜杠。

是否有可能在不调用事件的情况下将该斜线添加到散列?

也许在做window.unbind('hashchange')。这会起作用吗?而且还需要在HTML4浏览器中工作,因此HTML5 History API不是此处的选项。

回答

1

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

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

+0

我可以为HTML4浏览器做些什么?对不起,我知道我没有指定。谢谢。 – Cameron

+0

pushState仍然会创建一个历史记录条目,但replaceState会正常工作...除了它只是HTML5 :) – Cameron

+0

@Cameron对于HTML4浏览器,您可能需要保留一些额外的额外状态以指示是否引起了当前的'hashchange'事件通过你自己故意改变哈希,如果是这样的捷径调用AJAX调用。它不能解决“额外的历史记录”问题,但它可能有所帮助。 – Alnitak

0

这样做似乎工作:

// Unbind hashchange 
$(window).unbind('hashchange'); 

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

// Rebind hashchange        
$(window).bind('hashchange'); 

对这个有什么想法?如我可能遇到的未知问题等。