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

首頁 > 開發 > AJAX > 正文

實例解析Ajax標簽導航-DOM技巧篇

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

DOM技巧篇(DOM基礎知識)

講到這里,我們就要了解一下DOM的一些基礎知識了。

DOM(Document Object Model 文檔對象模型)是HTML和XML的應用程序接口(API)。DOM將把整個頁面規劃成有節點層級構成的文檔。HTML或XML頁面的每一個部分都是一個節點的衍生物。

光說可能還不怎么好理解,那么來看看我們ajax標簽導航的DOM結構吧,如圖五(截取的FIXFOX中的DOM圖象):

DOM通過創建樹來表示文檔,從而使開發著對文檔的內容和結構具有空前的控制力。用DOM API可以輕松地刪除,添加和替換節點。

簡單的了解了什么是DOM后(要想了解更多的Javascript DOM 編程知識,推薦大家看看《Javascript DOM 編程藝術》和《Javascript高級編程》這兩本書,還有到作者的網站去看看,也可以直接到W3C去查詢相關信息。),來看看我們這個程序里需要用到的DOM知識吧:document.getElementsByTagName()還有之前提到的(i)函數,它們都是做什么用的呢?

document.getElementById("DOMId"):它返回的是以ID為表示的節點,而大家都知道id在頁面中是唯一的,所以getElementById是在頁面中搜索DOM節點最直接的方法,很常用。不過它只能查尋單個的DOM節點,我們要查詢一組怎么辦呢? 我們可以使用getElementsByTagName和getElementsByName。

從方法名字中的“Elements”我們也可以知道,這兩個方法返回的是一組元素(數組)

getElementsByTagName:(核心[XML]DOM)用來返回一個包含所有tagName(標簽名)特性等于某個指定值的元素的NodeList。

getElementsByName:(HTML DOM)用來獲取所有name特性等于指定值的元素。但是這個方法在IE6和opera7.5中支持不是很好,會有錯誤產生,所以(個人)建議一般不要用。

OK,在對使用DOM來查尋節點的知識有了了解后,我們再來看這段代碼:

/* ===========================================================
* 函數名稱:(i)
* 參數說明:i - 目標節點名稱
* 函數功能:獲取指定的目標DOM節點
* 返 回 值:返回要搜索的目標DOM節點
* 使用方法:("frmSearch")
============================================================ */
function (i){
if(!document.getElementById)return false;
if(typeof i==="string"){
if(document.getElementById && document.getElementById(i)) {
// W3C DOM
return document.getElementById(i);
}
else if (document.all && document.all(i)) {
// MSIE 4 DOM
return document.all(i);
}
else if (document.layers && document.layers[i]) {
// NN 4 DOM.. note: this won't find nested layers
return document.layers[i];
}
else {
return false;
}
}
else{return i;}
}

這個函數主要是來查找指定的DOM節點的,主要是通過document.getElementById()方法,但是我們又看到了document.all()和document.layers[]方法,這個就是瀏覽器大戰時期(各個瀏覽器對DOM標準支持不程度不同),各大瀏覽器提供商制定的各自的DOM支持規范而造成的,我們的CSS HACKS其實也是由于這個原因才會出現的。扯遠了,document.all()是IE瀏覽器(IE5以上版本)中特有的查詢節點的方法,而document.layers[i]則是其他瀏覽器(主要是NetScape的)的瀏覽器特有的。我們通過(i)函數來統一調用,從而解決了瀏覽器兼容的問題。

而下面這里的代碼:

// DOM節點(tabs)不存在或者瀏覽器不支持getElementsByTagName()函數不執行
if(!tabs || !document.getElementsByTagName) return false;

這里if(!tabs || !document.getElementsByTagName) return false;這么寫是很有必要的,這里是一種預留退路的思想(在《Javascript DOM 編程藝術》一書一直灌輸的思想),這么寫在不支持getElementsByTagName()方法時我們的函數就不會執行,在不tabs(("news")和("sports")),不存在的時候(可能是我們把參數名寫錯了),函數也不執行了,從而避免了彈出或顯示腳本錯誤的信息。下面我們還將看到這一思想的體現,不過我們還是先來看看緊接的代碼:

var theList = tabs.getElementsByTagName("li"); // 搜尋導航標簽(ID為tabs)里的所有li標簽
var theLink = tabs.getElementsByTagName("a"); // 搜尋導航標簽(ID為tabs)里的所有a標簽

為什么要找出所有的li和a標簽呢?呵呵,這個是由于我這里采取的設置樣式的結構決定的(其實我也老是覺得不怎么好,不過這個思維個人比較好理解--頭疼醫頭,腳疼醫腳的方法)??纯次覀兩线叺腃SS樣式,大家看到了,我們是用改變標簽菜單(li)的樣式來實現特別顯示當前標簽的。那么我這里就自然要獲取所有的li標簽,然后給他添加onclick來調用ajaxInject(ListName,tabId,tarObj,URL),從而改變標簽的樣式??纯次襾韺崿F這個功能的代碼吧:

for(var j=0;j<theList.length;j++){
var theTab = theList[j];
if(theTab.parentNode!=tabs) continue;

var theA = theLink[j];
// 屏蔽掉a標簽默認的處理(打開新鏈接)事件
theA.onclick = function(){
return false;
}

// 為導航TAB菜單(li)設置onclick處理方法(函數)
theTab.onclick = function(){
var theClass = this.className;
if(theClass!="current" && theClass!="first"){
var objId = this.getAttribute("id").split("-")[1]; // 當前選中標簽(li)在菜單(ul)中的索引值
var tarObj = this.getAttribute("id").split("-")[0]; // 要顯示信息的目標DOM節點ID值
var theURL = tarObj + "/" + tarObj + objId + ".htm"; // 要異步加載的URL地址
ajaxInject((tarObj),objId,tarObj,theURL);
return false;
}
}
}

我們通過使用一個for循環來遍歷所有的li和a標簽(由于它們個數相同,所以索引的值相同),然后分別為它們設置onclick事件。先看我們給a標簽添加的事件的代碼:

var theA = theLink[j];
// 屏蔽掉a標簽默認的處理(打開新鏈接)事件
theA.onclick = function(){
return false;
}

一個簡單的return false,可別小看它哦,有幾個作用哦,首先a標簽是嵌套在li標簽里的,我們點li時就一定會出發a標簽的默認行為,打開鏈接的頁面。而我們ajax標簽導航就是希望不刷(打開)新頁面,在指定的DOM節點顯示信息。當然就不能讓a標簽的默認行為啟動了,而簡單的一個return false;就解決了這個問題。哦,這里還有個問題就是DOM事件的冒泡的順序,詳細的介紹大家可以在《Javascript高級編程》一書中查到。

那有些朋友會問,為什么要在里面加個a標簽呢?反正你是改變的是li的樣式,點了li,改變li的樣式,然后刷新指定DOM節點的信息不就完成了ajax標簽導航的功能(效果)了嗎?

是啊,不過我在這里要提的就是剛才提到的一個預留退路的思想,如果想上面說的那樣做了,當然是沒有什么問題,但前提是用戶的瀏覽器支持javascript腳本,或者說用戶打開了執行腳本的權限。一旦用戶的瀏覽器不支持javascript或者出于安全原因關閉了腳本執行功能。這個時候,當用戶點li時是沒有任何反映的。而我這里的處理就考慮到了當javascript執行不了的情況,這時候,用戶點鏈接就可以打開我們原本要用ajax加載的內容了。

其實這里還有各個比較簡單的方法來達成我提到的相同的效果,就是對li使用onmouseover事件,想想為什么?因為只要鼠標劃過時,就觸發了ajaxInject((tarObj),objId,tarObj,theURL);改變了標簽的樣式,刷新了內容。當點擊鏈接時,就可以彈出頁面了?,F在網易和雅虎中國就是這么處理的。其實我這么做主要是處于個人習慣,比較喜歡用onclick,還有就是這里有個分隔線的效果,看上去比網易的只用一個背景圖片酷,當然我的效果是學的雅虎(不是雅虎中國)的。不過雅虎的標簽樣式的處理方式要比我現在的更巧妙,下次有時間再跟大家分析下雅虎的標簽導航效果。

又扯遠了,OK,接下來我們就是要改變樣式和ajax刷新內容了。不過在這個之前,看看我做了什么準備。


<ul class="tabs" id="news">
<li class="first" id="news-0"><a href="news/news0.htm">網站重構</a><span></span></li>
<li id="news-1"><a href="news/news1.htm">CSS布局實錄</a><span></span></li>
<li id="news-2"><a href="news/news2.htm">海嘯的地盤</a><span></span></li>
<li id="news-3"><a href="news/news3.htm">Ajax高級編程</a><span></span></li>
</ul>

var objId = this.getAttribute("id").split("-")[1]; // 當前選中標簽(li)在菜單(ul)中的索引值
var tarObj = this.getAttribute("id").split("-")[0]; // 要顯示信息的目標DOM節點ID值
var theURL = tarObj + "/" + tarObj + objId + ".htm"; // 要異步加載的URL地址

看看我文章前面部分羅列的東西,現在就在這里有了回應了

id="news" - news就是我們的導航標簽的ID;
id="news-0" - news-0 通過”-“分開,我們就分別可以得到news(導航標簽ID),0(標簽[li]在導航標簽中的索引值)

好現在就要改變標簽的樣式了

/* ===========================================================
* 函數名稱:ajaxInject(ListName,tabId,tarObj,URL)
* 參數說明:ListName - 標簽菜單DOM節點ID
* tabId - 選中的標簽(在ListName中的)索引值
* tarObj - 要顯示返回信息的目標DOM節點ID值
* URL - 要異步處理的URL地址
* 函數功能:設置當前選中標簽(li)的樣式,
* 將返回信息寫到指定DOM節點中。
* 返 回 值:無
* 使用方法:ajaxInject((tarObj),objId,tarObj,theURL);
============================================================ */
function ajaxInject(ListName,tabId,tarObj,URL){
if(!ListName || !document.getElementsByTagName) return false;
var Tabs = ListName;
var theLi = Tabs.getElementsByTagName("li");
for(var i=0;i<theLi.length;i++){
// 設置當前選中標簽的樣式
if(i==tabId){
if(i==0){
theLi[tabId].className = "first"; // 當選中第一項的樣式
}
else{//
theLi[tabId].className = "current"; // 選中其他項的樣式
}
var msgBox = tarObj+"Cnt";
var loadstatustext="<div class='loading'><img src='img/loading.gif' alt='正在加載內容, 請稍候...' />正在加載內容, 請稍候...</div>";
(msgBox).innerHTML = loadstatustext; // 加載信息時的提示信息
var para = "?d=" + Math.random(); // URL后的參數,接Math.random()(一個隨機數),目的是處理ajax的緩存問題
var myAjax = ajaxUpdater(msgBox,"get",URL,para);
}
else{// 設置其他標簽的樣式
theLi[i].className = "";
if(tabId!=0){
theLi[tabId-1].className = "off"; // 當不是第一項時,隱藏選中項的前一項的分隔標簽
}
}
}
}

這里又跟前面的

id="newsCnt" - newsCnt就是我們要寫入信息的目標DOM節點;
class="first" - first當前(第一個)標簽的樣式;

對應起來了。

for(var i=0;i<theLi.length;i++){
// 設置當前選中標簽的樣式
if(i==tabId){
if(i==0){
theLi[tabId].className = "first"; // 當選中第一項的樣式
}
else{
theLi[tabId].className = "current"; // 選中其他項的樣式
}
}
else{// 設置其他標簽的樣式
theLi[i].className = "";
if(tabId!=0){
theLi[tabId-1].className = "off"; // 當不是第一項時,隱藏選中項的前一項的分隔標簽
}
}
}

上面這段代碼就是具體改變樣式的,i==tabId比較當前標簽的索引值(作用就是確認是否是選中的標簽),相等了就給標簽設置樣式了。i==0表明第一項被選種(由于我的第一項的背景特殊的)給它加上“first”樣式,其余項被選中則加上“current”樣式。

接這就是處理分隔錢的樣式了,跟設置背景大同小意,這里要說的是我們在寫CSS的時候要把li(選中和失去焦點)的樣式設置好。還是我之前提到的,YAHOO的做得很好,我記得網上也有關于滑動門技術CSS寫法的介紹,大家可以看看是怎么來設置樣式的,還有這里給大家推薦個小軟件《CSS Tab Designer 2》。

恩,現在要刷新指定DOM節點的內容了,用一個簡單的var myAjax = ajaxUpdater(msgBox,"get",URL,para);就解決問題了。不過我們看看在把信息寫到指定DOM節點前,我做了什么:

var msgBox = tarObj+"Cnt";
var loadstatustext="<div class='loading'><img src='img/loading.gif' alt='正在加載內容, 請稍候...' />正在加載內容, 請稍候...</div>";
(msgBox).innerHTML = loadstatustext; // 加載信息時的提示信息

這里做了一個提示的處理,因為ajax是異步的加載,在獲取很長(信息量很大)的內容時,會有一個延時,如果在這個期間不給任何提示信息的話,我們要刷新的DOM節點會出現白白的一片,這個當然是不美觀的。所以在這之前,我們給用戶一個提示信息,說明正在加載信息會顯得更人性化些。當然,大家知道的網易的處理會更好些,做一個延遲的window.setTimeout效果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文娱乐网| 91亚洲精品一区二区| 色综合久久中文字幕综合网小说| 欧美乱大交xxxxx| 国产视频自拍一区| 国产欧美一区二区三区在线| 91亚洲人电影| 国产午夜精品视频| 麻豆国产精品va在线观看不卡| 91亚洲人电影| 中文日韩在线观看| 高清欧美一区二区三区| 国产精品第8页| 日韩精品中文字幕有码专区| 亚洲va欧美va国产综合剧情| 久久影院模特热| 亚洲精品小视频在线观看| 久久久国产精品亚洲一区| 91九色视频在线| 色偷偷偷综合中文字幕;dd| 美女av一区二区| 尤物tv国产一区| 日韩国产高清污视频在线观看| 国产成人精品视频在线| 国产精品成人av性教育| 亚洲精品电影网在线观看| 中文字幕精品久久久久| 国内精品视频久久| 国产精品扒开腿爽爽爽视频| 中文字幕亚洲一区二区三区五十路| 国内精品小视频在线观看| 欧美性猛交xxxx黑人猛交| 亚洲精品乱码久久久久久按摩观| 国产999精品久久久| 亚洲白虎美女被爆操| 欧美日韩在线观看视频| 日本精品一区二区三区在线播放视频| 国产日韩欧美在线视频观看| 欧美大片va欧美在线播放| 欧美激情中文字幕乱码免费| 亚洲第一免费网站| 伊人青青综合网站| 欧美黑人巨大精品一区二区| 这里只有精品视频在线| 久久精品中文字幕| 亚洲日本欧美日韩高观看| 91久久在线播放| 日本中文字幕久久看| 亚洲一区二区少妇| 欧美高清无遮挡| 成人性生交大片免费观看嘿嘿视频| 中文字幕精品一区久久久久| 国产91在线播放| 日韩经典第一页| 国产精品狼人色视频一区| 国产亚洲精品美女久久久久| 日本一区二区在线播放| 亚洲黄色片网站| 最近2019年好看中文字幕视频| 久久久国产精彩视频美女艺术照福利| 国产91在线播放九色快色| 91高潮精品免费porn| 国产精品一久久香蕉国产线看观看| 亲子乱一区二区三区电影| 欧洲成人午夜免费大片| 国产第一区电影| www.色综合| 亚洲国产精品电影| 欧美视频在线视频| 久久精品91久久久久久再现| 日韩免费黄色av| 成人欧美一区二区三区在线| 一区二区三区精品99久久| 国产精品免费一区| 在线日韩中文字幕| 欧美日韩国产中文字幕| 亚洲第一福利视频| 亚洲美腿欧美激情另类| 亚洲黄色成人网| 欧美精品激情在线观看| 欧美日韩一区二区三区在线免费观看| 欧美一级片久久久久久久| 国外成人在线视频| 97碰在线观看| 日韩成人在线视频观看| 欧美性猛交xxxx富婆| 爽爽爽爽爽爽爽成人免费观看| 亚洲欧洲偷拍精品| 色一区av在线| 91精品国产综合久久男男| 国产亚洲一区二区精品| 日韩视频永久免费观看| 在线播放国产一区中文字幕剧情欧美| 日韩欧美aaa| 川上优av一区二区线观看| 亚洲精品mp4| 日韩免费不卡av| 日本精品中文字幕| 久久人人爽人人爽人人片亚洲| 日韩av在线影视| 91在线免费网站| 最近日韩中文字幕中文| 26uuu另类亚洲欧美日本一| 亚洲深夜福利在线| 91成人在线视频| 色综合久久天天综线观看| 69视频在线播放| 日韩av网站导航| 日韩欧美成人精品| 亚洲视频在线观看| 色琪琪综合男人的天堂aⅴ视频| 国产精品久久久久秋霞鲁丝| 亚洲影院色无极综合| 午夜精品久久17c| 亚洲国产精品女人久久久| 亚洲欧美日韩精品久久| 国产精品对白刺激| 国产精品第一视频| 97久久久久久| 欧美综合国产精品久久丁香| 欧美一级视频一区二区| 国产亚洲成精品久久| 国产成人一区二区| 国产91精品不卡视频| 亚洲永久在线观看| 欧美亚洲成人精品| 久色乳综合思思在线视频| 国产精品普通话| 日韩动漫免费观看电视剧高清| 91网在线免费观看| 日韩欧美亚洲成人| 国语对白做受69| 欧美性猛xxx| 亚洲成人a**站| 91亚洲精品久久久久久久久久久久| 亚洲自拍偷拍视频| 久久综合色88| 黄网动漫久久久| 日韩精品在线免费观看视频| 疯狂做受xxxx高潮欧美日本| 亚洲无限乱码一二三四麻| 亚洲成色777777女色窝| 在线国产精品视频| 97热在线精品视频在线观看| 日韩亚洲精品电影| 国产精品永久在线| 日本欧美一二三区| 日韩人在线观看| 精品国产91久久久久久老师| 国产在线久久久| 国产97免费视| 久久国产精品久久国产精品| 九九精品在线观看| 97超碰国产精品女人人人爽| 91精品免费久久久久久久久| 国产精品视频久久| 一本大道香蕉久在线播放29| 亚洲最大成人免费视频| 亚洲精品国产欧美| 中文字幕在线看视频国产欧美在线看完整| 91豆花精品一区| 国内久久久精品| 日韩欧美视频一区二区三区| 亚洲成av人影院在线观看|