2009-12-18 60 views
26

我有當用戶操縱該網站可能有這樣的URL作爲如何使用JavaScript檢測地址欄更改?

http://example.com/myApp/#page=1 

一個沉重的Ajax應用程序,地址欄即可更改爲類似

http://example.com/myApp/#page=5 

無需重新加載頁面。

我的問題是下面的順序:

  1. 用戶爲書籤的第一個URL。
  2. 用戶操縱應用程序,使第二個URL是當前狀態。
  3. 在步驟1
  4. 在地址欄的變化,從http://example.com/myApp/#page=5http://example.com/myApp/#page=1的URL創建書籤的用戶點擊,但我不知道的方式來檢測的變化發生了。

如果我檢測到更改,則某些JavaScript會對其執行操作。

+0

我很好奇,爲什麼這個應用程序是這樣設計的?我看不到任何實際的URL更改需求。 – 2009-12-18 22:07:20

+0

它就像查詢字符串一樣工作,但不會導致瀏覽器重新加載頁面。這已完成,因此每次更改頁面時都不必檢索和加載客戶端的有效內容。有效載荷不容易緩存,需要大量的JavaScript初始化時間,並且不會爲客戶提供無暇的體驗。 – JoshNaro 2009-12-21 15:06:11

回答

33

HTML5引入了一個hashchange事件,它允許您註冊url散列更改通知,而無需使用定時器對它們進行輪詢。

它支持所有主流瀏覽器(Firefox 3.6,IE8,Chrome,其他基於Webkit的瀏覽器),但我仍然強烈建議使用一個庫來處理事件 - 例如通過使用定時器瀏覽器不支持HTML5事件,否則使用事件。

有關該事件的更多信息,請參見https://developer.mozilla.org/en/dom/window.onhashchangehttp://msdn.microsoft.com/en-us/library/cc288209%28VS.85%29.aspx

+1

現在如果只有那些IE6/7用戶全部升級到> = IE8。感謝更新。 – JoshNaro 2010-11-08 15:03:46

+0

謝謝。這個答案比接受的答案要好。 – 2012-06-17 07:52:44

+0

我開始使用hashChange事件的jqouery插件 - 一切都很流暢:D – JJschk 2012-12-11 15:19:29

19

定期檢查使用的setTimeout /間隔當前地址:

var oldLocation = location.href; 
setInterval(function() { 
     if(location.href != oldLocation) { 
      // do your action 
      oldLocation = location.href 
     } 
    }, 1000); // check every second 
+1

這個答案是正確的。您還應該考慮使用諸如YUI歷史管理器組件這樣的工具,它可以通過跨瀏覽器的方式爲您完成。 – 2009-12-18 22:12:33

+0

如果我輸入一個新地址並按Enter鍵,那麼當前頁面將無法停止該地址。 – ZippyV 2009-12-18 22:20:00

+2

是的,我希望有一個隱藏的事件或什麼。使用間隔對我來說似乎並不「正確」。謝謝。 – JoshNaro 2009-12-21 15:02:18

5

您應該擴展位置對象暴露可以綁定到一個事件。

即:

window.location.prototype.changed = function(e){}; 

(function() //create a scope so 'location' is not global 
{ 
    var location = window.location.href; 
    setInterval(function() 
    { 
     if(location != window.location.href) 
     { 
      location = window.location.href; 
      window.location.changed(location); 
     } 
    }, 1000); 
})(); 

window.location.changed = function(e) 
{ 
    console.log(e);//outputs http://newhref.com 
    //this is fired when the window changes location 
} 
+0

我需要jquery才能正常工作嗎? – ATOzTOA 2013-01-07 10:08:19

+1

實際上,因爲它使用了一個計時器,所以它並沒有真正帶來任何增強,而所選擇的解決方案的效果如何。 – jmd 2013-02-15 12:01:08

+1

擴展一個已經暴露了一個可以觀看的值的全局對象並不是最好的想法。 – Trendy 2016-09-22 14:38:39