2013-12-17 34 views
0

我製作單頁應用程序。我讀過以下文章create-crawlable-pushstate。 我只是用hashbang運行問題。這對我來說似乎是一種解決方案。但我不太確定,如果我用戶在那裏發生了什麼。這裏有一篇文章的例子:可壓縮javascript spa與pushstate SEO

// We're using jQuery functions to make our lives loads easier 
$('nav a').click(function(e) { 
     url = $(this).attr("href"); 

     //This function would get content from the server and insert it into the id="content" element 
     $.getJSON("content.php", {contentid : url},function (data) { 
      $("#content").html(data); 
     }); 

     //This is where we update the address bar with the 'url' parameter 
     window.history.pushState('object', 'New Title', url); 

     //This stops the browser from actually following the link 
     e.preventDefault(); 
} 

這很棒,但谷歌如何知道內容是可用的。 getJson函數是異步的,所以在加載內容之前將會推送該狀態。我的想法是,我加載內容後調用pushstate來顯示鏈接已準備就緒。

  1. 在我的方案中,用戶點擊href。
  2. 路由器捕獲哈希變化並調用一個函數。 (生成的內容後,我可以覆蓋點擊事件pushState的。
  3. 內容將被加載並生成。(時間通)

回答

2

谷歌不關心的JavaScript。它所看到的是網址。

您的服務器仍然需要爲每一個給定的URL上的頁面

隨着JS:

  1. 客戶端(瀏覽器,Googlebot的,等等)詢問http://example.com/whatever/whatever/whatever
  2. 服務器與/whatever/whatever/whatever
  3. 客戶端的頁面響應點擊鏈接與:
    • href="/something/something/something
    • Ajax</li> <li> preventDefault`
  4. 客戶端負載的內容與阿賈克斯
  5. 客戶端更改URL到/something/something/something無需重新加載整個頁面

沒有JS:

  1. 客戶端(瀏覽器,Googlebot的,等等)詢問http://example.com/whatever/whatever/whatever
  2. 服務器與/whatever/whatever/whatever
  3. 客戶端的頁面響應點擊鏈接與:
    • href="/something/something/something
    • Ajax</li> <li> preventDefault`
  4. 客戶機轉到/something/something/something(因爲沒有JS觸發preventDefault

後來的後來,有人直接去/something/something/something,同樣適用。服務器直接爲/something/something/something提供內容。然後當點擊一個鏈接(如果JS是可用的)時JS執行Ajax的東西。

+0

在應用內容更改之前或之後,URL通常無關緊要。我只能看到它是一個問題,如果JS需要很長時間才能完成更新並且用戶複製/粘貼新的URL,則認爲它會轉到舊頁面。谷歌不會運行JS(它會遵循常規鏈接),所以Google對它根本沒有任何影響。 – Quentin

+0

由JS生成的內容不會被編入索引。這就是爲什麼您使用'pushState'(提供真實的URL)並將這些內容放在這些可索引的URL上。 – Quentin

+0

hashbangs和'pushState'都要求你讓服務器生成可索引的頁面。區別在於,使用'pushState',瀏覽器看到的URL和獲取索引的URL是相同的。使用'pushState'時,瀏覽器在到達時加載的URL是用戶實際想要查看的頁面。隨着hashbangs,它是主頁,然後運行一堆Ajax並被取代。因此,從hashbang到'pushState'消除了Twitter幾年前出現的一些可怕的性能問題。所以hashbangs *已經過時了。 – Quentin