2014-02-14 39 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'); 

對這個有什麼想法?如我可能遇到的未知問題等。