2011-06-29 66 views
3

我正在尋找將我的網站移動到完全異步文檔加載,但我不想使用請求處理的#!方法,因爲1)我不想斷開鏈接,2)我想要更靈活的方式來處理網站獲得的URI。Hashbang與URI解析

我已經能夠爲我的網站構建一個輕型MVC,它允許使用通用樣式的網址(例如:http://ddrewdesign.com/blog/jquery-is-or-is-child-of-function)來提出正確的請求。

我的問題是:這很容易做到。我錯過了什麼?爲什麼Gawker和Google選擇#!,這種方法似乎從用戶體驗角度來看更有意義?

編輯

爲了澄清,原來,我的網站是使用單獨的檢索請求的查詢字符串方法(無mod_rewrite)。這些鏈接遍佈整個網絡,我不能讓它們斷裂。這是我的理解,他們會,如果我移動使用hashbang方法。再一次:這可能是我混亂的一部分,所以我不是說我已經解釋了一切。我在問我錯過了什麼,因爲到目前爲止我沒有看到任何東西讓我看起來像我可以容納那個查詢字符串。

+0

我不能完全看到在哪裏使用#!在URL中斷鏈接。你能舉一個這種情況發生的例子嗎? – demonkoryu

+0

你如何使前進和後退按鈕的工作? – Pointy

+0

@Pointy:我還沒有得到那麼多,但是內部鏈接表面上會被正常寫入,並被Javascript攔截以處理請求併發布響應。如果這不起作用,那麼我想我必須以某種方式手動編寫它。 @demonkoryo:編輯澄清。 – dclowd9901

回答

3

我認爲你正在尋找history.pushState網址,它允許你做部分網頁加載,並有和沒有JavaScript的相同的網址。

例如,假設您的基本網址http://site.com/隨着history.pushState,您可以使用JavaScript來修改頁面是javascript.htm,使URL改變http://site.com/javascript.htm

#!網址只能使用javascript,因爲#fragment無法訪問服務器端。隨着hashbangs,你的網址將是類似於http://site.com/#javascript.htm請注意,!是不必要的。由於您可以在散列之後設置任何內容,因此您也可以使用url http://site.com/#!/javascript.htm

不幸的是,由於IE不支持history.pushState,所以你必須有#!的url作爲後備。

這兩種方法都沒有打破後退按鈕,但必須爲每種方法設置不同的方式。

Hashbangs工作是這樣的:

function change(){ 
    //page update logic 
} 

//hashchange event binding 
(typeof window.addeventListener === "function") 
    ? window.addEventListener("hashchange", change, false) 
    : window.attachEvent("onhashchange", change); 

//This is how the hash is set 
location.hash = "hashstring"; 

//Accessing it returns the hashstring, with a # 
location.hash; //returns #hashstring 

History.pushState是更復雜一點,因爲你存儲在一個對象的頁面的「狀態」。

下面是關於這種方法的一些很好的參考:

兩種方法都需要JavaScript頁面操作。我有這種類型的網址的例子。 http://timshomepage.net/comic/已鏈接到一堆不同的webcomics,並將它們嵌入到頁面中的iframe中。在禁用javascript的情況下,該鏈接將類似http://timshomepage.net/comic/dilbert。隨着history.pushState,我可以有相同的網址。隨着hashbang後備,我得到這樣的網址:http://timshomepage.net/comic/#!/dilbert

+0

你說「有或沒有Javascript的網址相同」。使用此方法的網站如何在沒有Javascript的情況下處理請求? – dclowd9901

+0

@ dclowd9901 url只是一個普通的url,所以這取決於你的服務器端腳本語言和url方案。 – timw4mail