跨瀏覽器通用、可重用的選項(xiàng)卡tab切換js代碼
由于近來(lái)學(xué)了點(diǎn)js,于是我裝逼道。。。不太難吧。。。就切一下display屬性?同學(xué)無(wú)視我。。說(shuō)要搞個(gè)通用的。。。什么還要跟ajax交互。。???我愣是沒(méi)有聽(tīng)懂。。。到底要搞什么。。。權(quán)當(dāng)作練手,我自己胡弄了一個(gè)。
需求:同學(xué)口中的通用我不知道神馬意思。。。那我就按自己的理解吧。。
?、倏鐬g覽器,IE6+,F(xiàn)F,Chrome,Safari,Opera
?、谕粋€(gè)頁(yè)面可以用同一個(gè)js設(shè)置不同的選項(xiàng)卡。
說(shuō)太多沒(méi)啥米用,來(lái)看代碼吧。
一、html部分(其實(shí)這還沒(méi)啥好看的,設(shè)置了三個(gè),前兩個(gè)是一樣的,通過(guò)click事件觸發(fā),最后一個(gè)通過(guò)鼠標(biāo)移動(dòng)觸發(fā))
<div class="tab1">
<ul class="name">
<li>項(xiàng)目一</li>
<li>項(xiàng)目二</li>
<li>項(xiàng)目三</li>
</ul>
<ul class="content">
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目一內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目二內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目三內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
</ul>
</div>
<div class="tab1">
<ul class="name">
<li>項(xiàng)目一</li>
<li>項(xiàng)目二</li>
<li>項(xiàng)目三</li>
</ul>
<ul class="content">
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目一內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目二內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab1"</em>項(xiàng)目三內(nèi)容,通過(guò)<em>"click"</em>觸發(fā)</li>
</ul>
</div>
<div class="tab2">
<ul class="name">
<li>項(xiàng)目一</li>
<li>項(xiàng)目二</li>
<li>項(xiàng)目三</li>
</ul>
<ul class="content">
<li>類(lèi)為<em>"tab2"</em>項(xiàng)目一內(nèi)容,通過(guò)<em>"mouseover"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab2"</em>項(xiàng)目二內(nèi)容,通過(guò)<em>"mouseover"</em>觸發(fā)</li>
<li>類(lèi)為<em>"tab2"</em>"項(xiàng)目三內(nèi)容,通過(guò)<em>"mouseover"</em>觸發(fā)</li>
</ul>
</div>
特別聲明,由于我是菜鳥(niǎo),所以,我寫(xiě)的js只能在某種特定的結(jié)構(gòu)下運(yùn)作(真菜!),沒(méi)有想到怎么搞個(gè)極致的通用機(jī)制。這個(gè)js需要怎樣的結(jié)構(gòu)?那就是最外層一個(gè)div容器,標(biāo)題由一個(gè)ul列表表示,內(nèi)容也是一個(gè)ul列表。如果不是這種格式,我寫(xiě)的菜鳥(niǎo)代碼是無(wú)法運(yùn)行的(菜啊。。。),要運(yùn)行,就要改改其中的幾行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;
}
這貌似沒(méi)什么好說(shuō)的,加了些最簡(jiǎn)單的css3,湊合著(這美工好爛啊)。
三、js代碼
/**
* 事件處理通用函數(shù)
*/
var EventUtil = {
//跨瀏覽器取事件對(duì)象event
getEvent : function(event){
return event ? event : window.event;
},
//款瀏覽器取事件對(duì)象的目標(biāo)DOM節(jié)點(diǎn)
getTarget : function(event){
return event.target||event.srcElement;
},
//跨瀏覽器對(duì)節(jié)點(diǎn)進(jìn)行事件綁定
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;
}
}
};
//設(shè)置選項(xiàng)卡切換方式
tabSwitch("tab1","click");
tabSwitch("tab2","mouseover");
/**
* 選項(xiàng)卡通用函數(shù)
*/
// 傳入?yún)?shù)inClassName設(shè)定為綁定的選項(xiàng)卡類(lèi)名,參數(shù)triggerType設(shè)定為觸發(fā)切換的類(lèi)型
function tabSwitch(inClassName,triggerType){
//取得全部選項(xiàng)卡區(qū)域
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]);
}
}
}
//為每個(gè)選項(xiàng)卡建立切換功能
for(var j=0,len=tabs.length; j<len; j++){
//獲取標(biāo)題和內(nèi)容列表
var tab = tabs[j];
//使用私有作用域?yàn)槊總€(gè)選項(xiàng)卡建立切換
(function(){
var nameUl = tab.getElementsByTagName("ul")[0];
var content = tab.getElementsByTagName("ul")[1];
//初始化選項(xiàng)卡
nameUl.getElementsByTagName("li")[0].className = "selected";
content.getElementsByTagName("li")[0].style.display = "block";
//添加事件委托
EventUtil.addHandler(nameUl,triggerType,function(event){
//獲取事件對(duì)象
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//選項(xiàng)卡切換
if(target.nodeName.toLowerCase() == "li"){
//分別取得標(biāo)題列表項(xiàng)和內(nèi)容列表項(xiàng)
var nameList = nameUl.getElementsByTagName("li");
var contentList = content.getElementsByTagName("li");
//標(biāo)題添加selected類(lèi),并顯示內(nèi)容
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函數(shù),我們展開(kāi)一下吧(很不害羞?。?。。首先定義了一些事件對(duì)象的通用函數(shù),以應(yīng)對(duì)跨瀏覽器時(shí)的使用。接著兩行是選項(xiàng)卡切換的函數(shù)。一個(gè)參數(shù)是要定義為選項(xiàng)卡的容器的類(lèi),一個(gè)是觸發(fā)切換的類(lèi)型。
完了就是真正的js,思路是:定義為某個(gè)類(lèi)的容器將會(huì)綁定成一個(gè)選項(xiàng)卡,切換的方式也可以自定義。tabSwitch("tab1","click");就是所有tab1類(lèi)都綁定為選項(xiàng)卡,通過(guò)click事件切換。
實(shí)現(xiàn)切換用到了幾個(gè)技術(shù),其一,通過(guò)類(lèi)選擇器selectqueryAll對(duì)同一類(lèi)型進(jìn)行選擇,為了兼容IE6、7,做了一個(gè)備用的遍歷版本(非常低效);其二,使用了事件委托,在標(biāo)題列表ul上綁定了觸發(fā)事件。
抱怨一下,在取ul的DOM元素時(shí),我用了name作為變量名,結(jié)果在chrome和safari綁定不了事件,這里搞了我好久啊!非常郁悶。。。
最后一提的是效果,這個(gè)東西有什么效果?就是選項(xiàng)卡切換(廢話。。),選中的選項(xiàng)卡標(biāo)題會(huì)添加一個(gè)類(lèi)“selected”,方便設(shè)定樣式。
最后的最后,我想說(shuō),還真有很多要改進(jìn)的地方(當(dāng)然的,你又不是pis神)。例如,涉及類(lèi)添加時(shí),類(lèi)名的字符串并接保證原有類(lèi)名不覆蓋。例如,可以應(yīng)對(duì)一下結(jié)構(gòu)變換的適應(yīng)能力。例如(好多問(wèn)題?。?。。。
至于還有什么毛病,請(qǐng)各位大俠指導(dǎo)了(這人臉皮厚,盡管?chē)姡?br /> 按道理要上傳demo的?點(diǎn)此實(shí)例下載
- javascript實(shí)現(xiàn)tab切換的四種方法
- 一個(gè)精簡(jiǎn)的JS DIV層tab切換代碼
- 基于jquery的tab切換 js原理
- js中常用的Tab切換效果(推薦)
- JS實(shí)現(xiàn)簡(jiǎn)單的tab切換選項(xiàng)卡效果
- div+css+js模擬tab切換效果 事件綁定 IE,firefox兼容
- JS封裝的選項(xiàng)卡TAB切換效果示例
- javascript回車(chē)完美實(shí)現(xiàn)tab切換功能
- javascript的tab切換原理與效果實(shí)現(xiàn)方法
- JS實(shí)現(xiàn)的簡(jiǎn)單tab切換功能完整示例
相關(guān)文章
JavaScript的各種常見(jiàn)函數(shù)定義方法
這篇文章主要介紹了JavaScript的各種常見(jiàn)函數(shù)定義方法,包含了一些技巧的測(cè)試與分析總結(jié),需要的朋友可以參考下2014-09-09詳解ES6 中的Object.assign()的用法實(shí)例代碼
這篇文章主要介紹了ES6 Object.assign()的用法及用途,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01JS實(shí)現(xiàn)方向鍵切換輸入框焦點(diǎn)的方法
這篇文章主要介紹了JS實(shí)現(xiàn)方向鍵切換輸入框焦點(diǎn)的方法,涉及javascript鼠標(biāo)事件及頁(yè)面元素焦點(diǎn)的切換實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08微信小程序判斷頁(yè)面是否從其他頁(yè)面返回的實(shí)例代碼
這篇文章主要介紹了微信小程序判斷頁(yè)面是否從其他頁(yè)面返回的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07JavaScript事件委托技術(shù)實(shí)例分析
這篇文章主要介紹了JavaScript事件委托技術(shù),實(shí)例分析了事件委托技術(shù)的原理、適用場(chǎng)合及用法實(shí)例,需要的朋友可以參考下2015-02-02H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決
這篇文章主要為大家介紹了H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05