DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 跨浏覽器通用、可重用的選項卡tab切換js代碼
跨浏覽器通用、可重用的選項卡tab切換js代碼
編輯:關於JavaScript     
由於近來學了點js,於是我裝逼道。。。不太難吧。。。就切一下display屬性?同學無視我。。說要搞個通用的。。。什麼還要跟ajax交互。。???我愣是沒有聽懂。。。到底要搞什麼。。。權當作練手,我自己胡弄了一個。
  需求:同學口中的通用我不知道神馬意思。。。那我就按自己的理解吧。。
    ①跨浏覽器,IE6+,FF,Chrome,Safari,Opera
    ②同一個頁面可以用同一個js設置不同的選項卡。
  說太多沒啥米用,來看代碼吧。
一、html部分(其實這還沒啥好看的,設置了三個,前兩個是一樣的,通過click事件觸發,最後一個通過鼠標移動觸發)
復制代碼 代碼如下:
<div class="tab1">
<ul class="name">
<li>項目一</li>
<li>項目二</li>
<li>項目三</li>
</ul>
<ul class="content">
<li>類為<em>"tab1"</em>項目一內容,通過<em>"click"</em>觸發</li>
<li>類為<em>"tab1"</em>項目二內容,通過<em>"click"</em>觸發</li>
<li>類為<em>"tab1"</em>項目三內容,通過<em>"click"</em>觸發</li>
</ul>
</div>
<div class="tab1">
<ul class="name">
<li>項目一</li>
<li>項目二</li>
<li>項目三</li>
</ul>
<ul class="content">
<li>類為<em>"tab1"</em>項目一內容,通過<em>"click"</em>觸發</li>
<li>類為<em>"tab1"</em>項目二內容,通過<em>"click"</em>觸發</li>
<li>類為<em>"tab1"</em>項目三內容,通過<em>"click"</em>觸發</li>
</ul>
</div>
<div class="tab2">
<ul class="name">
<li>項目一</li>
<li>項目二</li>
<li>項目三</li>
</ul>
<ul class="content">
<li>類為<em>"tab2"</em>項目一內容,通過<em>"mouseover"</em>觸發</li>
<li>類為<em>"tab2"</em>項目二內容,通過<em>"mouseover"</em>觸發</li>
<li>類為<em>"tab2"</em>"項目三內容,通過<em>"mouseover"</em>觸發</li>
</ul>
</div>

特別聲明,由於我是菜鳥,所以,我寫的js只能在某種特定的結構下運作(真菜!),沒有想到怎麼搞個極致的通用機制。這個js需要怎樣的結構?那就是最外層一個div容器,標題由一個ul列表表示,內容也是一個ul列表。如果不是這種格式,我寫的菜鳥代碼是無法運行的(菜啊。。。),要運行,就要改改其中的幾行js啦。。。
二、樣式CSS
復制代碼 代碼如下:
body{
text-align:center;
}
.tab1, .tab2 {
width:350px;
margin:0 5px;
background:#CC9933;
opacity:0.5;
border-radius:5px 5px 5px 5px;
box-shadow: #CCC 4px 4px 4px;
text-align:left;
float:left;
display:inline;
}
.name {
list-style:none;
overflow:hidden;
}
.name li {
width:90px;
font:bold 16px/30px Verdana, Geneva, sans-serif;
background:#669900;
text-align:center;
border-radius:5px 5px 5px;
margin-right:5px;
float:left;
display:inline;
cursor:pointer;
}
li.selected{
background:#FF9900;
}
.content li{
height:500px;
display:none;
}

 這貌似沒什麼好說的,加了些最簡單的css3,湊合著(這美工好爛啊)。
三、js代碼
復制代碼 代碼如下:
/**
* 事件處理通用函數
*/
var EventUtil = {
//跨浏覽器取事件對象event
getEvent : function(event){
return event ? event : window.event;
},
//款浏覽器取事件對象的目標DOM節點
getTarget : function(event){
return event.target||event.srcElement;
},
//跨浏覽器對節點進行事件綁定
addHandler : function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,handler);
}else{
element["on"+type] = handler;
}
}
};
//設置選項卡切換方式
tabSwitch("tab1","click");
tabSwitch("tab2","mouseover");
/**
* 選項卡通用函數
*/
// 傳入參數inClassName設定為綁定的選項卡類名,參數triggerType設定為觸發切換的類型
function tabSwitch(inClassName,triggerType){
//取得全部選項卡區域
if(document.querySelectorAll){
var tabs = document.querySelectorAll("."+inClassName);
}else{
var divs = document.getElementsByTagName("div");
var tabs = new Array();
for(var k=0,lenDiv=divs.length; k<lenDiv; k++){
if(divs[k].className.indexOf(inClassName) > -1){
tabs.push(divs[k]);
}
}
}
//為每個選項卡建立切換功能
for(var j=0,len=tabs.length; j<len; j++){
//獲取標題和內容列表
var tab = tabs[j];
//使用私有作用域為每個選項卡建立切換
(function(){
var nameUl = tab.getElementsByTagName("ul")[0];
var content = tab.getElementsByTagName("ul")[1];
//初始化選項卡
nameUl.getElementsByTagName("li")[0].className = "selected";
content.getElementsByTagName("li")[0].style.display = "block";
//添加事件委托
EventUtil.addHandler(nameUl,triggerType,function(event){
//獲取事件對象
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//選項卡切換
if(target.nodeName.toLowerCase() == "li"){
//分別取得標題列表項和內容列表項
var nameList = nameUl.getElementsByTagName("li");
var contentList = content.getElementsByTagName("li");
//標題添加selected類,並顯示內容
for(var i=0,len=nameList.length; i<len; i++){
nameList[i].className = "";
contentList[i].style.display = "none";
if(nameList[i] == target){
nameList[i].className = "selected";
contentList[i].style.display = "block";
}
}
}
});
})();
}
}

就這js函數,我們展開一下吧(很不害羞啊)。。。首先定義了一些事件對象的通用函數,以應對跨浏覽器時的使用。接著兩行是選項卡切換的函數。一個參數是要定義為選項卡的容器的類,一個是觸發切換的類型。
  完了就是真正的js,思路是:定義為某個類的容器將會綁定成一個選項卡,切換的方式也可以自定義。tabSwitch("tab1","click");就是所有tab1類都綁定為選項卡,通過click事件切換。
  實現切換用到了幾個技術,其一,通過類選擇器selectqueryAll對同一類型進行選擇,為了兼容IE6、7,做了一個備用的遍歷版本(非常低效);其二,使用了事件委托,在標題列表ul上綁定了觸發事件。
  
  抱怨一下,在取ul的DOM元素時,我用了name作為變量名,結果在chrome和safari綁定不了事件,這裡搞了我好久啊!非常郁悶。。。
  最後一提的是效果,這個東西有什麼效果?就是選項卡切換(廢話。。),選中的選項卡標題會添加一個類“selected”,方便設定樣式。
  最後的最後,我想說,還真有很多要改進的地方(當然的,你又不是pis神)。例如,涉及類添加時,類名的字符串並接保證原有類名不覆蓋。例如,可以應對一下結構變換的適應能力。例如(好多問題啊)。。。
  至於還有什麼毛病,請各位大俠指導了(這人臉皮厚,盡管噴)。
  按道理要上傳demo的?點此實例下載
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved