2012-03-31 113 views
22

可能重複:
What’s the shebang/hashbang (#!) in Facebook and new Twitter URLs for?做Twitter,Hash-Bang#等鏈接! URL的

我想知道Twitter的工作原理及其鏈接。

如果你看看源代碼,你可以使用鏈接完成像/#!/ i/connect或/#!/ i/discover,但是它們沒有JavaScript函數,像加載( '連接')或其他東西,並且它不需要重新加載頁面。它只是改變了頁面內容。

我看到了this頁面,但所有這些文件都必須存在,並且不能直接轉到其中的一個。我想,在Twitter上,這些文件中的每一個都不存在,並且用其他方法處理。不過,如果我錯了,請糾正我。

有沒有一種方法可以複製這種效果?如果是這樣,有沒有關於如何去做這個的教程?

+0

當您將問題標記爲重複時,對重複本身的引用會很有用。這是你的意思嗎? http://stackoverflow.com/questions/3009380/whats-the-shebang-hashbang-in-facebook-and-new-twitter-urls-for?lq=1 – 2013-07-27 04:52:43

+0

你現在應該認真重新考慮你接受的答案爲@ BillBad解釋說它非常好! – 2014-09-02 17:54:10

+0

@Emin沒關係,我是這麼做的!有一段時間沒有回過頭來看這個問題 – ixchi 2014-09-05 01:09:20

回答

96

「散列砰」導航,因爲它有時也被稱爲...

http://whatever.com/path/to/#!/some-ajax-state 

...是很快成爲一個非問題由於現代暫時治標不治本的解決方案瀏覽器標準。很可能,Twitter將逐步淘汰,正如Facebook已經在做的那樣。

它是幾個概念組合...

在過去,一個鏈接的目的有兩個:它加載一個新的文檔和/或向下滾動到嵌入式主播與指示哈希(#)。

http://whatever.com/script.php#fourth-paragraph 

散列之後的任何內容不是從服務器請求的,而是由瀏覽器在頁面中搜索的。這一切仍然工作得很好。

隨着AJAX的採用,新的內容可以加載到當前(已經加載)的頁面。有了這個動態加載,出現了幾個問題:1)沒有用於書籤或鏈接到這個新內容的唯一URL,2)搜索永遠不會看到它。

一些聰明的人通過使用散列作爲一種「狀態」引用來解決第一個問題,將其包含在鏈接&書籤中。文檔加載後,瀏覽器讀取散列並運行AJAX請求,顯示頁面及其動態AJAX更改。

http://whatever.com/script.php#some-ajax-state 

這解決了AJAX的問題,但搜索引擎的問題仍然存在。搜索引擎不會像瀏覽器一樣加載頁面並執行JavaScript。

谷歌來救援。 Google提出了一種方案,其中任何帶有散列(#!)而不是散列(#)的URL都會向搜索機器人建議存在用於索引的備用URL,其中涉及「_escaped_fragment_」變量的東西。閱讀關於它在這裏...

https://developers.google.com/webmasters/ajax-crawling/docs/getting-started

今天,在大多數主流瀏覽器採用JavaScript的pushState的的,這一切正變得過時。通過pushstate,當內容被動態加載或更改時,當前頁面URL可以被修改而不會導致頁面加載。如果需要,這將爲書籤&歷史記錄提供真實的工作網址。然後可以像往常一樣製作鏈接,不含哈希&哈希 - 磅碼

從今天起,如果您在較早的瀏覽器中加載Facebook,您將看到哈希碼,但當前瀏覽器將演示使用pushstate。

+2

真棒答案!我一直在瀏覽互聯網最後1小時,以瞭解整個概念,並且你解釋得非常好。 – 2014-06-06 06:37:58

+4

它沒有過時。值得注意的是,如果你有一個(文字)單個頁面的應用程序更改網址將無法正常工作。您必須設置您的Web服務器以將所有請求通配到幕後的單個頁面。 – Caleb 2014-10-11 17:17:27

+0

@Caleb這非常非常重要,我總是閱讀「hashbangs已經死了」之類的東西,但通常每個人都會忽略那些細節。 – user4052054 2017-05-02 04:47:08

2

您可能想了解更多有關Unique URLs的信息。

它通過AJAX加載頁面,並解析「散列」(在「#」之後的值)以確定它要加載的頁面。此外,由於AJAX請求不計入瀏覽器的歷史記錄,因此使用了此方法,因此「後退按鈕中斷」。但是瀏覽器確實存儲了哈希變化的歷史。

使用散列加上你可以使用散列來確定頁面的事實,你可以說你可以保持AJAX請求的頁面「在歷史中」。除此之外,散列URL只是URL,它們可以包括散列,所以您也可以爲AJAX請求的頁面添加書籤。

+0

Twitter如何擁有/#!/ URL路徑呢?這隻會增加#。另外,有沒有一個生動的例子? – ixchi 2012-03-31 01:32:57

+1

如果你想要一個生動的例子,只需使用Twitter即可。 'window.location.hash'返回像##/ i/connect或#!/ i/discover'之類的「#」(包括散列)之後的任何內容。然後,您可以使用該字符串來確定要通過AJAX加載的位置。這取決於網站他們如何使用哈希來確定他們去哪裏。在散列之後如何解析數據沒有標準的做法。在twitter中,它在第一個'/'之後開始解析。只有輸入'/#!/'或'/#'纔會加載主頁。 – Joseph 2012-03-31 01:37:06

+0

我正在查看有關window.location.has的代碼,不知道它的含義。 '(function(){var a = document.getElementsByTagName(「html」)[0],b = window.location.hash.split(「?」)[0],c = b.match(/#/)&& b .replace(/#[!]?[\ /]?/,「」)!==「」; c?a.className + =「remove-prerendered-content」:(a.className + =「use-prerendered-content 「,a.getAttribute(」data-nav-highlight-class-name「)&&(a.className + =」「+ a.getAttribute(」data-nav-highlight-class-name「)))})(); ' – ixchi 2012-03-31 01:48:32