亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Web標準的UI組件 — 樹狀菜單(2)

 更新時間:2006年09月18日 00:00:00   作者:  
從這篇開始,你需要擁有一些Javascript和DOM相關(guān)的知識才能順利地學(xué)習(xí)下去。由于Javascript和DOM都不是三言兩語可以說完的東西,如果你對它們還不熟悉,請先到這里學(xué)習(xí)一下再繼續(xù):Javascript在線教程(英文)、DOM在線教程(英文)。

getElementsByClassName()

  為了從一大堆HTML代碼中找出我們的樹狀菜單(也許有多個),我們先來實現(xiàn)一個通過className找DOM節(jié)點的方法:getElementsByClassName。這是對瀏覽器自有DOM方法的一個簡單但實用的擴充。

  此方法有兩個參數(shù):ele指出以哪個DOM節(jié)點為根節(jié)點尋找(也就是說只找ele的子節(jié)點),className指出符合條件的節(jié)點的class屬性中必須包含怎樣的className。它的返回值是一個數(shù)組,存放了所有符合條件的節(jié)點。

function getElementsByClassName(ele,className) {
 //獲取所有子節(jié)點
 if(document.all){
  var children = ele.all;
 }else{
  var children = ele.getElementsByTagName('*');
 }
 //遍歷子節(jié)點并檢查className屬性
 var elements = new Array();
 for (var i = 0; i < children.length; i++) {
  var child = children[i];
  var classNames = child.className.split(' ');
  for (var j = 0; j < classNames.length; j++) {
   if (classNames[j] == className) {
    elements[elements.length] = child;
    break;
   }
  }
 }
 return elements;
}

  最前面的一個if-else語是為了兼容IE5(IE5不能運行document.getElementsByTagName('*'))。需要注意的是千萬不要用瀏覽器檢測的方法來寫腳本,而應(yīng)該直接使用將要用到的語句來測試是否可以執(zhí)行,如果返回值為nullundefined,那再換一種方法。這樣的腳本可以有更好的兼容性,也更健壯。

  elements[elements.length] = child;,這句同樣是為了兼容IE5才沒有使用數(shù)組的push方法。如果你一定要使用push方法,那么可以在執(zhí)行getElementsByClassName()之前先重載一遍push方法。代碼如下:

Array.prototype.push = function(value){
 this[this.length] = value;
}

  注:原本我希望getElementsByClassName也能像push方法一樣寫,比如HTMLElement.prototype.getElementsByClassName = ...。不過實際操作的時候發(fā)現(xiàn)在運行時HTMLElement這個對象并不是固定的,每種tag似乎都不一樣,只能作罷。如果你有解決方案請告訴我,謝謝。

  現(xiàn)在我們就可以方便地找出頁面上所有的樹狀菜單了:

var trees	= getElementsByClassName(document,'TreeView');
for(var i=0;i<trees.length;i++){
 alert('我是第' + i + '個樹狀菜單');
 //在這里可以更細致地處理每一個樹狀菜單
}

  最后把上面這幾句加到window.onload事件中運行,以便文檔一加載完就對樹狀菜單進行初始化。完整的代碼請查看下面例子的源代碼。

  查看效果(例1)

區(qū)分樹枝與樹葉

  在上一篇中我們說到樹枝和樹葉的區(qū)別就是這個節(jié)點有沒有子節(jié)點,所以判斷樹枝和樹葉的方法也可以從這個角度來考慮。一個比較直觀的方法就是遍歷整個樹狀菜單的DOM樹(注意這里兩個“樹”的區(qū)別),看看每個節(jié)點是不是擁有子節(jié)點,如果有的話我們就給這個節(jié)點一個專門的class以示區(qū)分。我們這里用一種比較取巧的方法,就是判斷各個節(jié)點的innerHTML中有沒有出現(xiàn)字符串'<ul>'。如果有的話,那么很顯然它擁有一個或多個子節(jié)點。

var trees	= getElementsByClassName(document,'TreeView');
for(var i=0;i<trees.length;i++){
 //先把所有的節(jié)點找出來
 var nodes = trees[i].getElementsByTagName('LI');
 //判斷各個節(jié)點是否有子節(jié)點
 for(var j=0;j<nodes.length;j++){
  if(nodes[j].innerHTML.toLowerCase().indexOf('<ul>') > -1)
   nodes[j].className += 'Open';
 }
}

  這里給每個樹枝加了一個className:Open,因為我們現(xiàn)在還不能打開關(guān)閉樹枝,所以只要是樹枝那就是open的。當(dāng)然后面我們會用到Close的:)。相應(yīng)的修改一下CSS,給樹枝一個帶減號的圖標,表示它是打開的:

.TreeView li.Open{
 background:transparent url(opened.gif) 12px 2px no-repeat;
}

  查看效果(例2)

高亮選中項

  接下來實現(xiàn)把當(dāng)前選中的樹枝(或樹葉)高亮的功能。有兩個時候需要高亮:菜單初始化的時候和點擊某個菜單項的時候。

  初始化的時候比較容易處理,直接給需要高亮的節(jié)點一個特殊的Class即可,比如“Selected”:

.TreeView li.Selected a:link,
.TreeView li.Selected a:visited,
.TreeView li.Selected a:hover,
.TreeView li.Selected a:active{
 background-color:#05F;
 color:#FFF;
 text-decoration:none;/*去除下劃線*/
 cursor:default;/*讓光標變?yōu)槠胀^,假裝是不能點的^_^*/
 padding:0 2px;/*為了美觀考慮,也可以不要這句*/
}

  查看效果(例3)

  這里有幾點可能還需要補充說明一下:

  1. 選擇器(Selector)的前面為什么要加上.TreeView,這不是冗余代碼嗎?
    在這個例子中確實是冗余代碼,但在實際項目中,一個頁面上可能會有各種不同的組件,比如還有一個菜單,被選中的菜單項也用.Selected來表示。這時就需要在選擇符的前面先指出是什么組件的選中項以防沖突。當(dāng)然還有其他的解決辦法,比如這里的類不取名為Selectd,改為TreeSelected或者其他什么的,但是這樣做人為的把命名方案復(fù)雜化了,我個人不推薦這樣做。
  2. 選擇器為什么分作四行來寫?
    因為我們之前已經(jīng)設(shè)置過a的樣式,為了提高優(yōu)先級重載舊的樣式,所以需要指定a的四種偽狀態(tài)(還有其他提高優(yōu)先級的辦法,關(guān)于優(yōu)先級算法,在《網(wǎng)站重構(gòu)》一書中有詳細說明)。
  3. Selected為什么要用在li上,而不直接用在a上?
    這又是一個不太容易說明白的地方,因為很大程度上它是一種個人習(xí)慣,只是我個人覺得這樣做更合適一些。事實上,寫在li上或a上都是可以的,至少看上去(表現(xiàn)層的視角)不會有太大的區(qū)別,但是如果你從“表現(xiàn)層”中跳出來,站在“結(jié)構(gòu)層”的視角來看,無論這個菜單的樹結(jié)構(gòu)還是DOM結(jié)構(gòu),一個節(jié)點都是由一個li來表達的,a只不過是這個節(jié)點內(nèi)的更細節(jié)的部分。雖然我最終是希望給a指定一個特殊的樣式(為什么不指定給li?你可以自己試一下),但從XHTML結(jié)構(gòu)來說,這個class="Selected"還是寫在li上更合適。(上帝保佑我說清楚了……)

下一篇講什么?

  這篇文章是我第一次加入Javascript內(nèi)容,不是很清楚是說淺了還是說深了,請大家在右邊留言告訴我你的想法。從下一篇開始,我們開始進入部署鼠標事件和響應(yīng)鼠標事件方面的內(nèi)容。也許從下下篇開始再加入一些Javascript面向?qū)ο缶幊痰膬?nèi)容,待定待定……h(huán)ehe^_^

相關(guān)文章

  • javascript嚴格模式詳解(含嚴格模式與非嚴格模式的區(qū)別)

    javascript嚴格模式詳解(含嚴格模式與非嚴格模式的區(qū)別)

    這篇文章主要介紹了javascript嚴格模式詳解(含嚴格模式與非嚴格模式的區(qū)別),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 聊聊JavaScript中的try...catch使用小技巧

    聊聊JavaScript中的try...catch使用小技巧

    作為一名web前端工程師,JavaScript中的try...catch是我們常用的特性之一,用于處理代碼中可能出現(xiàn)的錯誤,本文小編將和大家一起聊聊JavaScript中的try...catch使用小技巧,需要的朋友可以參考下
    2023-11-11
  • 詳解webpack打包時排除其中一個css、js文件或單獨打包一個css、js文件(兩種方法)

    詳解webpack打包時排除其中一個css、js文件或單獨打包一個css、js文件(兩種方法)

    本文通過兩種方法給大家介紹了webpack打包時排除其中一個css、js文件,或單獨打包一個css、js文件的方法 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • 微信小程序文章詳情頁跳轉(zhuǎn)案例詳解

    微信小程序文章詳情頁跳轉(zhuǎn)案例詳解

    這篇文章主要介紹了微信小程序文章詳情頁跳轉(zhuǎn)案例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 理解Javascript_01_理解內(nèi)存分配原理分析

    理解Javascript_01_理解內(nèi)存分配原理分析

    在正式開始之前,我想先說兩句,理解javascript系列博文是通過帶領(lǐng)大家分析javascript執(zhí)行時的內(nèi)存分配情況,來解釋javascript原理,具體會涵蓋javascript預(yù)加載,閉包原理,面象對象,執(zhí)行模型,對象模型...,文章的視角很特別,也非常深入,希望大家能接受這種形式,并提供寶貴意見。
    2010-10-10
  • 最全面的百度地圖JavaScript離線版開發(fā)

    最全面的百度地圖JavaScript離線版開發(fā)

    最全面的百度地圖JavaScript離線版開發(fā),這篇文章主要為大家詳細介紹了JavaScript離線版開發(fā)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JavaScript實現(xiàn)標題欄文字輪播效果代碼

    JavaScript實現(xiàn)標題欄文字輪播效果代碼

    這篇文章主要介紹了JavaScript實現(xiàn)標題欄文字輪播效果代碼,涉及JavaScript基于時間函數(shù)及流程控制操作標題欄文字的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • bootstrap table復(fù)雜操作代碼

    bootstrap table復(fù)雜操作代碼

    這篇文章主要為大家詳細介紹了bootstrap table復(fù)雜操作代碼,生成外層表格,填充表格內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • javaScript 計算兩個日期的天數(shù)相差(示例代碼)

    javaScript 計算兩個日期的天數(shù)相差(示例代碼)

    本篇文章主要介紹了javaScript 計算兩個日期的天數(shù)相差(示例代碼) 需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • javascript編程異常處理實例小結(jié)

    javascript編程異常處理實例小結(jié)

    這篇文章主要介紹了javascript編程異常處理的方法,結(jié)合實例形式分析總結(jié)了JavaScript編程中異常處理的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11

最新評論