J度空間

          用DIV+Javascript實現(xiàn)標簽功能

            現(xiàn)在很多網(wǎng)站都用到了標簽的切換功能,新浪、迅雷等網(wǎng)站都有,應該說用很很泛濫了。其實 標簽功能是Windows程序中的一種功能,在Delphi或VB等Windows程序開的環(huán)境中,很容易就能創(chuàng)建各種漂亮而又功能強大的標簽功能,但在 Web開發(fā)中,就沒有這種便利了。
            只需要銷加改動,標簽的數(shù)量可以自由添加,而無需要為標簽添加ID,實際上這個功能除了用到Div、Javascript之后,很重要的是要用到CSS樣式。
          ?
          ?
          圖1

             首先我們要確定我們要做什么,我們要做成一個帶三個標簽的區(qū)域(圖1),點擊標簽標簽列表的其中一個標簽,內(nèi)容區(qū)域會根據(jù)當前點擊的標簽顯示不同的內(nèi) 容。按照我們一般的做法是每一個標簽對應一個內(nèi)容區(qū)域,給每個內(nèi)容區(qū)域增加一個id屬性,然后為每一個標簽添加一個屬性,就像這樣:
          ?
          <div>???
          ?
          <div>???
          ??
          <div?id="label1"?onmousemove="dosomething()">label1<div>???
          ??
          <div?id="label2"?onmousemove="dosomething()">label2<div>???
          ??
          <div?id="label2"?onmousemove="dosomething()">label2<div>???
          ?
          </div>???
          ?
          <div>???
          ??
          <div?id="content1">第一個label的內(nèi)容</div>???
          ??
          <div?id="content2">第一個labe2的內(nèi)容</div>???
          ??
          <div?id="content2">第一個labe2的內(nèi)容</div>???
          ?
          <div>?????
          </div>??
          ???? 你可能沒有意識到這種辦法會有什么問題,當一個頁面有非常多的標簽塊的話,我們將不得不面臨一個問題,那就是id的命名問題,我們將要為每一個內(nèi)容區(qū)域命 名,這樣不僅增加了代碼量,也增加了javascript編寫的難度,我們不可能為每一個標簽塊寫一堆javascript,就算我將 javascript寫成一個函數(shù)或者一個類,我們也會而臨另一個問題,就是調(diào)用的時候會有一大堆的參數(shù),因為你需要將這個id傳送過去。并且,很容易因 為人為的疏忽造成錯誤。
            下面,來看看我是如何實現(xiàn)這個功能的吧,可能不是最好的方法,如果你有更好的方法,希望你能告訴我,讓我們一起進步。
          ???? 首先,我們要做的是寫好基本的html代碼,代碼如下:
          ?
          <html>???
          <head>???
          <meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312"?/>???
          </head>???
          ?????
          <body>???
          <ul?id="Label">???
          ?
          <!--我們將第一個標簽的背景色設(shè)置紅色,因為默認顯示的是第一個標簽的內(nèi)容-->???
          ?
          <li?class="CurrentLabel"?style="background-color:?red">標簽1</li>???
          ?
          <li>標簽2</li>???
          ?
          <li>標簽3</li>???
          </ul>???
          <div?id="Container">???
          ????
          <div>這時里是標簽1對應的內(nèi)容</div>???
          ????
          <!--因為默認是不顯示的,所以要將display屬性設(shè)置為none-->???
          ????
          <div?style="display:?none">這時里是標簽2對應的內(nèi)容</div>???
          ????
          <div?style="display:?none"?class="Content3">這時里是標簽3對應的內(nèi)容</div>???
          </div>???
          </body>???
          </html>?
          ???
          ????寫好基本html代碼后,我們還需要做一項重要的工作,那就是css樣式,因為li如果沒有css樣式控制,標簽就會以列表的形式出現(xiàn),基本的CSS樣式代碼如下:
          ?
          ?
          <style?type="text/css">????
          ?#Label?li????
          ?
          {????
          ??
          /*設(shè)置ID為Label的元素下所有l(wèi)i元素樣式,主要是要設(shè)置float:left這個屬性,這樣才能將li元素排成一排;同時設(shè)置了list-style:none這個屬性,目的是防止li元素出現(xiàn)實心圓點*/???
          ??margin-left
          :?1px;????
          ??padding
          :?3px;????
          ??width
          :?40px;????
          ??background-color
          :#94A5F8;????
          ??float
          :left;????
          ??list-style
          :none;????
          ??cursor
          :pointer;????
          ?
          }
          ????
          </style>????
          ???
             下面,我們將要進行最重要的一環(huán)了,就是javascript,看到你里,你可能會問,為什么標簽li元素沒有事件呢?如何實現(xiàn)標簽的切換呢,這是因為 我考慮了另一個問題,如果我們需要為每一個標簽添加一個事件的話,確實是一件很麻煩的事情,而且當標簽塊多了的時候,就會增加代碼量,所以我考慮使用動態(tài) 添加屬性的方式為每一個標簽添加屬性。
          ?
          ?
          function?LabelAddEvent()????
          ?
          {????
          ??
          var?labels?=?document.getElementById("Label").childNodes;????????//獲取ID為Label無素下的所有子節(jié)點,childNodes是DOM的一個屬性????
          ??//對所有子節(jié)點進行循環(huán),增加onmouseover事件,也可以根據(jù)需要添加onclick事件????
          ??for(var?iLoop?=?0;?iLoop?<?labels.length;?iLoop?++)????
          ??
          {????
          ???
          var?label?=?labels[iLoop];????
          ???
          if?("LI"?==?label.nodeName)???//只處理LI的DOM節(jié)點,目的是為了兼容Firefox,因為Firefox會把空格與換行與當成一個節(jié)點處理????
          ???{????
          ????label.value?
          =?iLoop;????????//為每一個標簽的value賦上當前的索引,當點擊標簽的時候不用循環(huán)標簽就知道是哪一個標簽了????
          ????label.onmouseover?=?function()????
          ????
          {????
          ?????ChangeLabel(
          this);??????????//調(diào)用ChangeLabel函數(shù),并把當前對象傳過去????
          ????}
          ;????
          ???}
          ????
          ??}
          ????
          ?}
          ????
            然后,我們在html頁的最后面,調(diào)用LabelAddEvent這個函數(shù),即可以為所有標簽添加函數(shù)了,是不是很簡潔,當我們有很多標簽塊的時候,就不必要為每個標簽塊添加事件了,下面我們來看看ChangeLabel這個函數(shù):
          ?
          ?
          function?ChangeLabel(oCur)????
          ?
          {????
          ??
          //獲取所有的內(nèi)容元素子節(jié)點????
          ??var?containers?=?document.getElementById("Container").childNodes;????
           
          //獲取所有的標簽????
          ??var?labels?=?document.getElementById("Label").childNodes;????
          ??
          for(var?iLoop?=?0;?iLoop?<?containers.length;?iLoop?++)????
          ??
          {????
          ???
          var?container?=?containers[iLoop];???????
          ???
          var?label?=?labels[iLoop];????
          ???
          //根據(jù)索引是否為li元素的value值來判斷是否為當前標簽????
          ???var?current?=?iLoop?==?oCur.value;??????
          ???
          if?("DIV"?==?container.nodeName)?container.style.display?=?current???"block"?:?"none";????
          ???
          if?("LI"?==?label.nodeName)?label.style.backgroundColor?=?current???"red"?:?"#94A5F8";????
          ??}
          ????
          ?}
          ??

             主要代碼就是這么多了,是不是很簡潔呢?當有很多個標簽塊的候,你就會發(fā)現(xiàn)這個方法的優(yōu)勢了,事實下,我們還可以簡單修改一下javascript代 碼,實現(xiàn)多個標簽塊在一個頁面中的功能,接下來我準備結(jié)合Xml及Xslt寫一個根據(jù)xml配置的多標簽塊的教程,如果你覺得有什么更好的方法可以實現(xiàn), 請你與我聯(lián)系,讓我們共同進步。

          ??
          ??版權(quán)所有?Conis,復制或者轉(zhuǎn)載請保留此信息,任何人未經(jīng)許可,不得擅自將本文發(fā)布作為商業(yè)用途。
          ??更多內(nèi)容更多精彩請您訪問http://www.conis.cn

          posted on 2007-08-28 12:47 藍色幽默 閱讀(911) 評論(1)  編輯  收藏 所屬分類: 網(wǎng)頁設(shè)計

          評論

          # re: 用DIV+Javascript實現(xiàn)標簽功能 2008-04-23 09:02 免貴

          實現(xiàn)不了  回復  更多評論   

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計

          常用鏈接

          留言簿(4)

          隨筆分類

          文章分類

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 广平县| 富裕县| 汝州市| 布尔津县| 渝中区| 呼伦贝尔市| 合肥市| 古蔺县| 桐城市| 宣城市| 荆门市| 伊宁县| 云南省| 那曲县| 博白县| 佛山市| 于都县| 南靖县| 体育| 松桃| 孝感市| 左权县| 安康市| 东乡县| 黔西县| 公安县| 河西区| 南宁市| 新泰市| 定边县| 饶河县| 惠水县| 乌鲁木齐市| 宁化县| 怀集县| 丹巴县| 乐都县| 积石山| 华阴市| 长白| 南宫市|