2012-01-23 34 views
4

隨着HTML5 API歷史消防wind​​ow.onpopstate事件,我創建類似下面:HTML5 API歷史 - 不要在第一頁加載

(function (d, w) { 

    $(function() { 

     $("#indicator").hide(); 

     if (typeof history.pushState !== 'undefined') { 

      $("#citylinks a").click(function (e) { 
       history.pushState({ path: this.href }, '', this.href); 
       act(this.href); 
       e.preventDefault(); 
      }); 

      w.onpopstate = function (event) { 
       act(d.location); 
      }; 
     } 

     function act(location) { 

      $("#results").hide(); 
      $("#indicator").show(); 

      $.getJSON(location, function (data) { 

       $("#results").html(data.result); 
       $("#results").fadeIn(); 

       $("#indicator").hide(); 
      }); 
     } 

    }); 

})(document, window); 

完整的代碼是在這裏:

https://github.com/tugberkugurlu/MvcMiracleWorker/commit/7c511f20678bbfe15462909c794eb323ce615372#diff-3

我在這裏的問題是,我不想在第一次從服務器發送頁面時觸發w.onpopstate事件。

我想這樣做的原因是我想在服務器端填充頁面,我不希望客戶端代碼這樣做。如果我刪除w.onpopstate事件,我將無法趕上history.go()事件。

有什麼辦法可以解決這個問題嗎?

回答

4

一個非常簡單的方法是這樣的:

w.onpopstate = function() { 
    w.onpopstate = function (event) { 
     act(d.location); 
    } 
} 

這意味着,第一次onpopstate事件觸發,你的功能設定到事件處理程序(替換當前處理器),有效地創建一個空操作用於事件在頁面加載時運行。

+0

不錯的解決方案。有一件事是它在每個'windows.onpopstate'事件上運行。我試圖阻止它(通過檢查'window.onpopstate'事件,如果'null'或'undefined')但不能得到它的工作。 – tugberk

+0

這是一個黑客解決方案。相反,您可以嘗試這樣的http://stackoverflow.com/a/11453389/191551。 –

+0

@Ryan:也許這很冒險,但我真的沒有看到它。如果有的話,它更有效率,因爲它不需要額外檢查你鏈接的例子。當然,我們正在談論微秒,這並不重要,但在另一方面,我沒有看到使用該技術的任何錯誤。這是我見過的很多次在很多腳本中都使用過的,很不幸,現在不能及時回想起來:-p –