2012-06-14 40 views
3

我一直在閱讀有關使AJAX密集型應用程序更多的搜索引擎友好: https://developers.google.com/webmasters/ajax-crawling/docs/getting-started創建抓取跨域的JavaScript控件

我有交付的解決方案,最近在很大程度上依賴於JavaScript的控件跨域。整合此解決方案的網站將在其網站中包含一段JavaScript。例如:

<script type="text/javascript"> 
    var _lw = _lw || {}; 
    _lw._setAccount = ' 00000000-0000-0000-0000-000000000000' ; 
    _lw._widgetType = '_widgetName'; 
    _lw._options = {}; 

    (function() { 
    var scriptsrc = document.createElement('script'); 
    scriptsrc.type = 'text/javascript'; 
    scriptsrc.async = true; 
    scriptsrc.src = 'http://hostname/Application/js'; 

    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(scriptsrc, s); 
    })(); 
</script>] 

<div id="widget-container"></div> 

此請求附加到一個jQuery包裝以及小部件將使用的相關應用程序URL。請注意,這段JavaScript代碼的來源是一個簡單的asp.net的MVC內容由此相關內容輸出:

[HttpGet] 
[ActionName("js")] 
public ContentResult RenderJavascript() 
{ 
     // java script urls & jquery wrapper are output 
} 

現在必要的URL是可用的,剛附加踢和火災jQuery的包裝使用帳戶信息,窗口小部件類型和任何相關選項向服務器發出請求。 ASP.net MVC只是充當內容生成器,它返回JSONP結果,其中生成的內容被附加到網站內容容器中。

function loadWidget() { 
    var jsonpUrl = _opts._widgetUrl + _lw._setAccount; 
    jQuery.getJSON(jsonpUrl, _lw._options, function (data) { 
     jQuery('#widget-container').html(data.html); 
    }); 
} 

我讀到的越多,我就讀這個過程更多的搜索引擎友好我不知道從哪裏開始。生成所需的HTML快照很容易,但是,我該如何向google表明應該抓取鏈接

另一個看起來有點有希望的選擇是關於如何處理沒有散列碎片的頁面。這可以通過添加使用JavaScript小部件的元標記來實現。

<meta name="fragment" content="!"> 

但是,現在的問題在於,這是一個跨域請求,並且不會在任何地方引導。

+0

除非你的小部件可以進行位置哈希變化,我不認爲這是可能的。請參閱:https://developers.google.com/webmasters/ajax-crawling/docs/getting-started –

回答

1

這是一個棘手的問題。谷歌並沒有抓取JavaScript(它本身不會像執行瀏覽器一樣執行它,但它至少會在JavaScript中查找URL,就像它在Flash,Word等文檔中那樣),所以有evidence。如果Google在你的JavaScript中點擊了'http://hostname/Application/js'並遵從它,然後從返回的JavaScript中解析URL,你就不需要做任何事情。

如果你想要一個更具體的解決方案,也許修改你的代碼像這樣:

<div id="widget-container"><iframe src="http://hostname/Application/iframe"></div> 

OR:

<div id="widget-container"><a href="http://hostname/Application/links"></div> 

當您的小部件的JavaScript由瀏覽器執行時,您可以將#widget-container的內容替換爲您通常替換的內容(您也可以添加style="visibility:invisible;"屬性,但我懷疑Google會因爲顯而易見的原因而懲罰「隱藏」內容),但當Googlebot停止時,它會抓取iframe /鏈接。在服務器端,您可以使用這些URL生成您在JavaScript中使用的相同鏈接列表,但使用易於消化的HTML。

可能使Googlebot更加快樂的其他選項是使用Schema.org對象,如WebPageElement,例如,:

<div id="widget-container" itemscope itemtype="http://schema.org/SiteNavigationElement"> 
    <link itemprop="url" href="http://hostname/Application/links"> 
</div> 

...然後讓目標頁面也包含Schema.org聲明。我不知道你是否會從之前的表單中獲得任何真正的好處,但是metadata is a love note to the future