亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

基于AJAX技術提高搜索引擎排名

2024-09-01 08:26:10
字體:
來源:轉載
供稿:網友

描述 嵌入在你的web頁面中的導航元素能夠降低你的搜索引擎評價排名并且降低你的網站的響應性能。本文作者想同你一起探討如何使用AJAX技術來解決這兩個問題。

許多設計良好的web站點都包含大量的與實際內容相聯系的可導航信息。用于導航的HTML標記能影響你的搜索引擎評價,而且能夠改進訪問者的頁面下載體驗感。在本文中,你會看到如何使用AJAX來創建更為集中的更快速加載的web頁面。

一、分離導航與內容

讓我們使用一個例子作為開始。請考慮你現在閱讀的文章,它有下列一些內容:

· 一個其上有一些預定義的到Informit的各個部分的鏈接的頁眉。

· 在頁眉下有一行,把本文放到Informit的目錄結構之中(實際上,這是唯一的與目錄相關的可導航元素)。

· 一個位于右首的側欄,其中有一些連接到流行文章和推薦內容的鏈接。

· 一個頁腳,還有一些永遠不會改變的鏈接。

上面的"混合"很可能會影響搜索引擎索引你的數據的方式:

· 因為搜索引擎不能區別內容與導航文本,所以它們會把它們在你的頁面中找到的一切進行索引。既然目錄中的關鍵字與不相關的可導航關鍵字混合在一起,那么內容之間的關聯大大減少。一些搜索引擎宣稱,它們能夠在被搜索到的頁面(例如,固定的頁眉和頁腳)中發現重復的文本并且刪除它們。但是,不要依賴這種可能性;即使它們實現了這種技術,也很可能不會一直可靠。

· web頁面中的外向鏈接影響你的內容的頁面評價。盡管這可能提高流行的文章的評價排名(因為許多頁面都鏈接到它們),但是所有的頁面都鏈接到的內容(例如,隱私策略)通常得到最高的頁面評價-這可能不是你一直關心的問題。在我的一個web站點中,最高的評價頁面是用于把消息發送到web管理員的表單-而不是你想讓用戶首先在Google上找到的內容。

注意

即使你不使用站點地圖,你也可以通過Google的站點地圖用戶接口來了解一下你的頁面的頁面排名情況。

添加到一個web頁面的可導航元素還可能影響使用低速互聯網存取的用戶,而如果web頁面不使用DIV元素(Informit使用之)而使用表格時更是如此。在這種情況中,在把它顯示給用戶之前,整個表格必須被加載到一些web瀏覽器中。

傳統地,web設計者一般都使用框架集或通過構建整套的導航架構(廣泛使用JavaScript代碼)來實現導航與內容的分離。這兩條途徑都存在其缺點;因此,許多大型網站避免使用框架集就不足為奇了。

借助于在AJAX框架中使用的技術,你可以為這一問題提供一種方案:

· 每一個web頁面僅包含可導航元素和實際內容的占位符。

· 在web頁面通過嵌入式框架(IFRAME)或使用XmlHttpRequest對象加載后,再裝載這些可導航元素。

· 然后,可導航元素的內容被合并到web頁面內容中,從而產生一個不嵌入任何幀的干凈的頁面。

在使用這種方法重新設計你的web頁面之前,你需要考慮下列問題:

· 搜索引擎僅將看到初始的web頁面。你必須確保,該頁面中包含到相關頁面或到一個網站地圖的鏈接。Informit網站中文章頁眉上方的導航線和在頁面的文章信息部分中的鏈接正好可以較好地實現這一目的。

· 在他們的瀏覽器中禁止調用JavaScript的訪問者將具有與搜索引擎相同的頁面視圖。你必須確保他們有受限的視圖不會給你的網站的功能造成較大影響。

· 你可能想在你的頁面上保留一些靜態內容。例如,Informit標識和版權信息必須一直顯示給所有的訪問者。

當你確定好應該把你的導航結構哪些部分依附到頁面上以及哪些部分應該與之分開之后,你就可以開始下一步驟了。

二、 設計你的Web頁面

實現分離內容和導航的第一步是,在web頁面上創建將插入可導航元素的占位符。對于每一個可導航元素的連續區域,你應該創建一個具有唯一id的獨立DIV元素;這樣以來,以后你可以在你的JavaScript代碼中標識它。為了防止過度晃動,在創作頁面期間,目錄上方或右邊的DIV元素的尺寸應該調整到非常接近你的可導航元素的實際大?。贿@樣,當你使用希望的HTML代碼來代替它們時內容就不會移動位置。為此,一種最巧妙的方法是把一個空的適當大小的DIV元素插入到該占位符處。

對于Informit網站來說,其頁面結構已經是良好設計的,且DIV元素已經非常到位。

你僅需要從可導航DIV元素中刪除內容并且插入一個空框,頁眉將會出現在這里(為了簡短起見,我們將忽略把公司標識和版權信息嵌入到每一個頁面中的討論)。下面是相應的代碼:

以下為引用的內容:
<div id="header">
<div style="height: 100px; width: 100%"></div>
</div>
<div id="contentArticle">
<div id="firstCol">
... article content ....
</div>
<div id="secondCol" ></div>
</div>
<div id="footer"></div>

注意

如果你的web頁面使用表格來實現所希望的頁面布局,那么請不要把表格單元格重用作占位符;而把DIV元素放到表格單元格內比較好一些。

已經被從web頁面中刪除的可導航的元素必須被重新創建為獨立的頁面。你應該使用靜態HTML文件來表達靜態內容(這將允許緩沖內容,不管你使用什么樣的web服務器)和在加載它們的web頁面上創建顯示基于動態元素的服務器端腳本。對于Informit來說,每一個web頁面都有唯一一個文章標識符(在URL中的"p="參數);因此,你需要創建一個能夠接受文章標識符并創建右邊的欄目的服務器端腳本。在大多數情況中,你可以重用創建嵌入的可導航元素的服務器端代碼。

在重新設計這些web頁面后,接下來,你就可以實現本方案中的AJAX部分了。與通常一樣,你可以使用嵌入式框架(IFRAME元素)工作,也可以選用一個XmlHttpRequest對象。

三、嵌入式框架

如果你關心瀏覽器兼容性的話,你應該使用嵌入式框架。一些老式的瀏覽器支持IFRAME元素,但不支持XmlHttpRequest對象。當然,使用這種方式還有如下一些理由:

· 被加載到一個IFRAME中的內容在裝載的過程中被顯示于瀏覽器中,這向終端用戶顯示一個可視化進程。

· 頁面緩沖總是使用加載到一個IFRAME中的內容工作。一些版本的Opera還不能較好地使用XmlHttpRequest對象處理經緩沖的響應。

為此,我們可以把一個空IFRAME插入到每一個DIV容器中,并且在每一個IFRAME后添加一個簡短的JavaScript語句,如下所示:

以下為引用的內容:
<div id="header">
<div style="height: 100px; width: 100%"></div>
<iframe id="header_iframe" style="height: 0px;"></iframe>
<script>loadIframe("header","/navigation/header.html")</script>
</div>

IFRAME的id應該等于以_iframe為后綴的占位符的id。loadIframe函數使用了兩個參數:占位符的id和要加載到其中的URL。

技巧

如果你想在下載過程中使得IFRAME內容可見,那么你應該使用一個適當大小的IFRAME元素來替換在占位符內的空的DIV框。然而,如果你想使IFRAME保持不可見,那么你應該使用style屬性來把它的高度設置為0以克服一些瀏覽器中的錯誤。

啟動裝載過程的loadIframe函數是很簡單的:

以下為引用的內容:
function loadIframe(id,url) {
 try {
  var iframeObj = document.getElementById(id "_iframe");
  iframeObj.src = url ;
 } catch (err) {
  alert("cannot load " url " into " id) ;
 }
}

注意

本文中所有示例代碼都假定,瀏覽器兼容文檔對象模型(DOM)。

然而,還沒有一種機制來通知請求頁面所希望的內容已經被加載到占位符IFRAME中。因此,被裝載的內容必須通知父頁面(經由一個JavaScript調用)可以使用該內容了。實現這一操作的最好時機是,在頁面加載完成以后。因此,在IFRAME內容中的BODY標志應該包含一個onLoad事件:

以下為引用的內容:
<body onload="contentLoaded('header')" style="margin: 0px 0px;
padding: 0px 0px">

技巧

加載到IFRAME中的內容的body部分應該總是有零邊距和填充空白;否則,當把它集成到父頁面中時,它將會輕微地遷移。

在IFRAME的上下文中執行的contentLoaded函數將提取body部分相應的HTML內容并且把它傳遞到一個在父頁面上下文中執行的函數,此函數將使用它來填充相應的占位符:

contentLoaded在IFRAME上下文的上下文中執行:

以下為引用的內容:
function contentLoaded(parentID) {
 var myContent = document.body.innerHTML ;
 parent.copyContent(parentID,myContent);
}

copyContent在父web頁面的上下文中執行:

以下為引用的內容:
function copyContent(id,content) {
 try {
  var placeholder = document.getElementById(id) ;
  placeholder.innerHTML = content;
 } catch (err) {
  alert("Cannot copy HTML content into " id);
 }
}

現在,細心的讀者應該感到疑惑,為什么這么復雜?在IFRAME元素中加載導航元素不是更簡單一些嗎?事實證明,對于此方法還要加一些防止誤解的說明為好:

·IFRAME具有固定的高度和寬度。如果內容彼此超出,則內容將被剪掉或者IFRAME要加上滾動條。然而,被復制到一個在父頁面中的DIV元素中的HTML標記其大小卻總是保持自動調整大小。

·當在一個IFRAME中時,在導航內容中的鏈接(一個元素)將裝載IFRAME中的新頁面,除非你把target="_parent"添加到每一個鏈接之后。

·依附到導航元素的JavaScript事件處理器將在IFRAME的上下文中工作(如果還保留這個上下文的話)。如果你把導航內容移動主頁面上,那么事件處理器能夠存取在主頁面中定義的函數和變量。

四、使用XmlHttpRequest

如果你的用戶主要使用Internet Explorer的較新版本或基于Gecko的瀏覽器(Mozilla,Firefox,Netscape 7),那么你可以決定使用XmlHttpRequest對象來把其它內容下載到你的web頁面中。第一步非常類似于前面描述的方式。對于每一個占位符,你需要一個JavaScript函數調用來啟動加載過程:

以下為引用的內容:
<div id="header">
<div style="height: 100px; width: 100%"></div>
<script>loadContent("header","/navigation/header.html")</script>
</div>

然而,loadContent函數是根本不同的:它創建了一個新的XmlHttpRequest對象,然后把一個事件處理器指派給它,并且異步啟動裝載過程:

以下為引用的內容:
function loadContent(id,url) {
 try {
  var rq = new XMLHttpRequest() ;
  rq.open("GET", url, true);
  rq.onreadystatechange = function() { contentLoaded(rq,url,id) }
  rq.send(null);
 } catch (err) {
  alert("cannot load " url " into " id) ;
 }
}

注意

每一種主流瀏覽器家族都以一種不同的方式實現了XmlHttpRequest對象。處理這種兼容性問題的最容易的方法是,使用一個包裝器庫,例如Sarissa。我們在本文中示例中就使用了這種庫。

回調函數contentLoaded負責檢查XmlHttpRequest對象是否已經準備好及完成狀態(如果請求已完成的話),并且從響應中提取HTML標記。提取HTML代碼(除非你使用XHTML,這種情況下,你可以使用XMLDOM接口)的最容易的方法是,使用字符串處理函數來查找<body>和</body>標志之間的文本:

以下為引用的內容:
function contentLoaded(rq,url,id) {
 try {
  if (rq.readyState != 4) { return; }
  if (rq.status != 200) { alert("failed to load " url); return; }
  var txt = rq.responseText ;
  //查找<body>標記的開始位置
  var startBodyTag = txt.indexOf("<body")
  //查找<body>標記的結束,跳過任何屬性
  var endOfStartTag = txt.indexOf(">",startBodyTag 1)
  //查找</body>標記
  var endBodyTag = txt.indexOf("</body")
  if (endBodyTag == -1) { endBodyTag = txt.length ; }
  //提取實際內容
  var bodyContent = txt.substring(endOfStartTag 1,endBodyTag)
  if (bodyContent) {
   var placeholder = document.getElementById(id) ;
   placeholder.innerHTML = bodyContent;
  }
 } catch (err) {
  alert("cannot load " url " into " id) ;
 }
}

與前面描述的基于IFRAME的方法相比,使用XmlHttpRequest對象具有下列好處:

·代碼更干凈,并且不依賴于頁面的上下文切換。

·XmlHttpRequest對象使你能夠檢測和處理錯誤(通過它的readyState和status屬性)。而使用IFRAME加載內容時,如果出現錯誤,則只能顯示非常粗略的錯誤提示,這主要是因為缺乏對回調函數的調用。

·你能夠實現內容元素的平行裝載(如在這一節中顯示的)或順序化裝載請求以最小化帶寬利用。

五、小結

在本文中,你學習了怎樣實現把你的web頁面內容與包圍該內容的可導航元素分離開來。分離導致更為集中地描述搜索引擎要搜索的頁面內容,并且也減少了用戶使用低速互聯網存取的加載時間(既然是在可導航元素被下載之前把實際內容顯示給用戶)。

當重新設計你的web頁面來利用這種方案時,切記,一些基本格式的導航必須保留在頁面上以便允許搜索引擎和決定禁止使用JavaScript的用戶在你的網站的頁面之間進行導航。

你可以使用嵌入式框架(IFRAME)或使用在最現代瀏覽器中實現的XmlHttpRequest對象來實現可導航元素的延遲裝載。IFRAME方法能夠為較老式的瀏覽器所支持;因此,它可能是你要考慮使用的方法-如果你非常關心向后兼容問題的話。另一方面,XmlHttpRequest對象的使用使你能夠更為緊密地控制裝載過程并能夠檢測和處理下載錯誤。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产不卡av在线| 欧美成人精品在线观看| 欧美国产日韩在线| 亚洲福利视频久久| 亚洲欧洲美洲在线综合| 亚洲美女精品久久| 久久免费视频这里只有精品| 奇米四色中文综合久久| 国产精品影院在线观看| 国产精品亚洲美女av网站| 丰满岳妇乱一区二区三区| 91极品女神在线| 97色在线视频| 欧洲精品在线视频| 国产一区二区美女视频| 国产精品稀缺呦系列在线| 亚洲欧美在线x视频| 亚洲2020天天堂在线观看| 欧美特级www| 亚洲国产福利在线| 国产亚洲视频在线| 成人黄色av网站| 国产精品成久久久久三级| 91系列在线播放| 亚洲国产精品成人精品| 亚洲加勒比久久88色综合| 这里只有精品丝袜| 2019亚洲男人天堂| 成人欧美一区二区三区在线湿哒哒| 91午夜在线播放| 中文字幕v亚洲ⅴv天堂| 国产日韩欧美在线看| 国产亚洲一级高清| 欧美成人免费视频| 日韩亚洲一区二区| 亚洲激情电影中文字幕| 韩国v欧美v日本v亚洲| 一区二区日韩精品| 欧日韩不卡在线视频| 国产成人综合一区二区三区| 一区二区三区四区精品| 久久精品视频在线播放| 国产一区二区三区高清在线观看| 在线色欧美三级视频| 国产日韩欧美在线看| 亚洲精品国产精品国自产在线| 精品色蜜蜜精品视频在线观看| 九九热最新视频//这里只有精品| 热久久美女精品天天吊色| 成人激情在线观看| 欧美日韩国产一区二区三区| 成人性生交大片免费看小说| 亚洲精品国产综合区久久久久久久| 亚洲男女性事视频| 6080yy精品一区二区三区| 日韩美女视频在线观看| 欧美美女操人视频| 国产精品久久久久久久一区探花| 亚洲欧美日韩爽爽影院| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美另类国产| 日产精品99久久久久久| 日韩成人在线观看| 992tv成人免费视频| 欧美激情一区二区三区高清视频| 亚洲自拍偷拍视频| 国产精品第二页| 韩国日本不卡在线| 国产成人精品免高潮在线观看| 日韩精品在线观| 国内精品久久久久伊人av| 欧美老女人在线视频| 日韩综合中文字幕| 欧美午夜精品久久久久久人妖| 亚洲一区二区三区视频| 久久久精品日本| 日韩成人网免费视频| 这里只有精品视频| 欧美中文字幕在线观看| 国产精品直播网红| 日韩精品在线免费观看| 亚洲男人第一网站| 青青久久av北条麻妃黑人| 亚洲黄色av女优在线观看| 成人黄色影片在线| 中文字幕av一区二区| 国产成人精品免费视频| 亚洲精品视频在线播放| 亚洲成色777777女色窝| 国产精品麻豆va在线播放| 亚洲r级在线观看| 国产性猛交xxxx免费看久久| 国产91露脸中文字幕在线| 欧美一级电影久久| 中文在线资源观看视频网站免费不卡| 欧美又大粗又爽又黄大片视频| 亚洲免费电影在线观看| 国产精品第2页| 欧美成人午夜剧场免费观看| 日韩国产高清污视频在线观看| 亚洲专区国产精品| 亚洲精品综合久久中文字幕| 国产日韩精品综合网站| 国产免费成人av| 菠萝蜜影院一区二区免费| 中文字幕日韩专区| 精品日韩视频在线观看| 精品久久久久久| 久久中国妇女中文字幕| 81精品国产乱码久久久久久| 成人在线中文字幕| 精品电影在线观看| 91国自产精品中文字幕亚洲| 国产一区二区在线播放| 欧美电影免费观看电视剧大全| 欧美刺激性大交免费视频| 国产不卡在线观看| 亚洲精品在线看| 另类天堂视频在线观看| 最新国产精品拍自在线播放| 欧美大成色www永久网站婷| 亚洲欧美国产视频| 日韩av影视在线| 亚洲视频日韩精品| 亚洲国产精品va在线观看黑人| 亚洲国产欧美一区二区三区久久| 不卡中文字幕av| 久久久之久亚州精品露出| 精品国产乱码久久久久久虫虫漫画| 欧美丝袜一区二区三区| 欧美黑人xxxⅹ高潮交| 日本一区二区在线免费播放| 亚洲网站在线播放| 97精品欧美一区二区三区| 欧美精品电影免费在线观看| 日韩欧美在线字幕| 亚洲第一页自拍| 亚洲美女久久久| 亚洲一区二区久久久| 久久久国产精品视频| 日韩中文视频免费在线观看| 欧美成人激情视频免费观看| 97久久伊人激情网| 中文日韩在线视频| 日本精品久久电影| 久久精品中文字幕电影| 欧美大胆在线视频| 91亚洲国产精品| www国产亚洲精品久久网站| 久久国产视频网站| 国产精品男人爽免费视频1| 国产精品爽黄69天堂a| 日韩欧美中文字幕在线播放| 亚洲国内精品视频| 一区二区三区 在线观看视| 久久在线视频在线| 岛国av在线不卡| 欧美日韩国产丝袜美女| 狠狠色狠狠色综合日日五| 成人黄色av网| 欧美色另类天堂2015| 欧美日韩国产中文精品字幕自在自线| 伊人久久精品视频| 亚洲有声小说3d|