JavaScript tab選項卡插件實例代碼
今天,先從最簡單的開始,將已有的一個Tab選項卡切換功能改寫成javascript插件形式。
原生函數(shù)寫法
將一個javascript方法改寫為js插件最簡單的方式就是將這個方法掛載到window全局對象下面
我們先來看看最原始的使用函數(shù)寫法的代碼:
tab.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="renderer" content="webkit">
<title>jquery_hjb_tab插件demo</title>
<link rel="stylesheet" href="h.css"/>
</head>
<body>
<div id="tab">
<div class="tabs">
<ul>
<li><a href="#">tab1</a></li>
<li><a href="#">tab2</a></li>
<li><a href="#">tab3</a></li>
<li><a href="#">tab4</a></li>
</ul>
</div>
<div class="tabCons">
<section>內(nèi)容一</section>
<section>內(nèi)容二</section>
<section>內(nèi)容三</section>
<section>內(nèi)容四</section>
</div>
</div>
<script>
window.onload = h_tab('tab');
function h_tab(tabId){
var oLinks = document.getElementById(tabId).getElementsByTagName("a");
var oCons = document.getElementById(tabId).getElementsByTagName("section");
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
}
</script>
h.css
@charset "utf-8";
/*
//author:hjb2722404
//description:
//date:2016/2/18
*/
.tabs ul { width: 100%; list-style-type: none;}
.tabs ul li { width: 48%; display: inline-block; margin: 0; padding: 0;}
.tabs ul li a {border-bottom: 3px solid #cccccc; width: 100%; height: 100%; display: block; text-align: center; min-height: 40px; line-height: 40px; text-decoration: none; font-family: "微軟雅黑"; color: #a94442}
.tabs ul li a.cur { border-bottom: 3px solid #f26123;}
.tabCons section { display: none;}
.tabCons section:nth-child(1) { display: block;}
上面兩份代碼為基本代碼,之后我們后一步步在這份代碼的基礎(chǔ)上進行改進。
原生插件寫法
好,現(xiàn)在,我們就來將這個方法改寫成掛載在window對象下的插件:
tab.html
……
// 下面是第一次改動
<script type="text/javascript" src="h_tabs.js"></script>
<script>
H_tab("tab");
</script>
</body>
</html>
h_tabs.js
window.H_tab = function(tabId){
var oLinks = document.getElementById(tabId).getElementsByTagName("a");
var oCons = document.getElementById(tabId).getElementsByTagName("section");
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
};
但是,我們發(fā)現(xiàn)這樣的寫法雖然很簡單,但也有問題:window作為一個全局對象,如果我們把自己的方法都掛載到它下面作為插件使用的話,插件一多,就容易產(chǎn)生命名空間沖突,另一方面,使用原生js雖然可以減少對外部的依賴,但代碼量相對還是很大,寫法比較繁瑣。
jquery寫法
我們嘗試引入jquery庫,將此插件改寫為jquery插件。
jquery插件有三種形式:類級別的形式,對象級別的形式,jquery UI組件的形式
jquery 類級別插件寫法–單個方法
我們先來看類級別插件的形式。
第一種類級別插件的形式,直接把該方法掛載到jquery的根空間下,作為一個工具方法:
tab.html
……
<script src="../jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="h_tabs.js"></script>
<script>
$.h_tab('tab');
</script>
</body>
</html>
h_tabs.js
$.h_tab = function(tabId){
var oLinks = document.getElementById(tabId).getElementsByTagName("a");
var oCons = document.getElementById(tabId).getElementsByTagName("section");
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
};
jquery類級別插件寫法-多個方法
如果你想要將多個方法綁定到jquery根空間上面,那么像下面這樣寫:
tab.html
……
<script src="../jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="h_tabs.js"></script>
<script>
$.h_tab('tab');
$.h_hello('hjb');
</script>
</body>
</html>
h_tabs.js
$.extend({
h_tab:function(tabId){
var oLinks = document.getElementById(tabId).getElementsByTagName("a");
var oCons = document.getElementById(tabId).getElementsByTagName("section");
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
},
h_hello :function(name){
console.log("hello,",name);
}
});
雖然使用$.extend()工具方法將自己的功能函數(shù)直接掛載到jquery根命名空間下,簡單,省事兒,但很不幸的是,這樣的方式不能利用jquery強大的sizzle引擎,即你選擇到的DOM元素無法運用這個方法。
所以我們要用到對象級別的插件開發(fā)方式。
jquery對象級別插件寫法
對象級別的插件開發(fā)方式是利用$.fn.extend()方法將自己的方法綁定到jquery原型上去,這樣所有jquery對象隊可以應用該方法來執(zhí)行相應操作了
代碼如下:
tab.html
……
<script src="../jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="h_tabs.js"></script>
<script>
//對象級別的插件引用方法,注意和上面類級別插件的寫法上的區(qū)分
$('#tab').h_tab('tab');
</script>
</body>
</html>
h_tabs.js
(function($){
$.fn.extend({
h_tab:function(tabId){
var oLinks = document.getElementById(tabId).getElementsByTagName('a');
var oCons = document.getElementById(tabId).getElementsByTagName('section');
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
}
});
})(jQuery);
這里,我們利用一個閉包封裝了插件,避免了命名空間污染
在這里,還有一些問題,就是我們的方法必須傳參數(shù)才可以運行,這就導致調(diào)用的時候我們使用$(‘#tab')選擇了id為tab的div,然后在插件里我們又根據(jù)傳入的ID獲取了一遍該元素。
既然我們已經(jīng)使用了jquery的選擇器,那么我們就可以引入this來解決重復獲取元素的冗余問題。
jquery對象級別插件寫法-引入this
tab.html
……
<script src="../jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="h_tabs.js"></script>
<script>
$('#tab').h_tab();
</script>
</body>
</html>
h_tabs.js
(function($){
$.fn.extend({
h_tab:function(){
//在這里引入this
var oLinks = this.find('a');
var oCons = this.find('section');
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
this.className="cur";
oCons[this.index].style.display ="block";
}
}
}
});
})(jQuery);
這里需要注意的是,我們調(diào)用該插件的元素對象是(′tab′),則此時直接使用this.find()就等價于(‘tab').find(),而不是$(this).find(),注意使用代入法來區(qū)分這兩種寫法的差別。
作為一款插件,它應該是可以被開發(fā)者控制的,所以還應該提供給使用者一些配置接口。
jquery對象級別插件寫法-加入配置項
tab.html
……
<ul>
<!--對照文章開始的代碼, 注意這里的改動 -->
<li><a href="#" class="current">tab1</a></li>
<li><a href="#">tab2</a></li>
……
<script src="../jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="h_tabs.js"></script>
<script>
$('#tab').h_tab({
//使得當前選項卡標簽的樣式名稱可自定義的配置
curName:'current'
});
</script>
</body>
</html>
我們這里把一開始的”當前選項卡標簽樣式類名稱“由”cur“改為了”current“,并將其作為配置項傳入插件
h.css
.tabs ul { width: 100%; list-style-type: none;}
.tabs ul li { width: 48%; display: inline-block; margin: 0; padding: 0;}
.tabs ul li a {border-bottom: 3px solid #cccccc; width: 100%; height: 100%; display: block; text-align: center; min-height: 40px; line-height: 40px; text-decoration: none; font-family: "微軟雅黑"; color: #a94442}
/*注意下面一行與之前的樣式代碼的對比變化之處*/
.tabs ul li a.current { border-bottom: 3px solid #f26123;}
.tabCons section { display: none;}
.tabCons section:nth-child(1) { display: block;}
我們在樣式表中做出了相應的改動。
h_tabs.js
(function($){
$.fn.extend({
//給方法傳入一個對象作為參數(shù)
h_tab:function(opts){
//定義默認的配置
var defaults ={
curName : 'cur'
};
//將傳入的參數(shù)覆蓋默認參數(shù)中的默認項,最終合并到一個新的參數(shù)對象上
var Opt = $.extend({},defaults,opts);
var oLinks = this.find('a');
var oCons = this.find('section');
for(var i = 0; i<oLinks.length; i++){
oLinks[i].index = i;
oLinks[i].onclick = function () {
for(var j =0; j<oLinks.length; j++){
oLinks[j].className="";
oCons[j].style.display = "none";
}
//在這里使用配置項的值
this.className = Opt['curName'];
oCons[this.index].style.display ="block";
}
}
}
});
})(jQuery);
在這里我們使用了jquery的$.extend()方法的合并對象的功能,使用用戶傳入的配置項覆蓋默認配置項并最終合并到一個新的配置項供后面的程序使用。
以上所述是小編給大家介紹的JavaScript tab選項卡插件實例代碼,希望對大家有所幫助!
- JavaScript插件Tab選項卡效果
- jquery插件tytabs.jquery.min.js實現(xiàn)漸變TAB選項卡效果
- js實現(xiàn)簡單選項卡功能
- js實現(xiàn)簡單的可切換選項卡效果
- js選項卡的實現(xiàn)方法
- javascript實現(xiàn)tabs選項卡切換效果(自寫原生js)
- JS實現(xiàn)選項卡實例詳解
- 使用vue.js寫一個tab選項卡效果
- Vue.js組件tabs實現(xiàn)選項卡切換效果
- 原生js實現(xiàn)tab選項卡切換
- js實現(xiàn)tab選項卡函數(shù)代碼
- Vue.js組件tab實現(xiàn)選項卡切換
- JS實現(xiàn)選項卡插件的兩種寫法(jQuery和class)
相關(guān)文章
等待指定時間后自動跳轉(zhuǎn)或關(guān)閉當前頁面的js代碼
本文為大家詳細介紹下如何通過js實現(xiàn)等待指定時間后自動跳轉(zhuǎn)或關(guān)閉當前頁面的腳步代碼,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-07-07
JavaScript(js)設(shè)置默認輸入焦點(focus)
常常會在回復和引用里使用此功能,即單擊回復或引用,如讓輸入焦點出現(xiàn)在留言輸入框中,如果使用錨來定位,輸入焦點就不能激活了,需要了解的朋友可以參考下2012-12-12
記一次webpack3升級webpack4的踩坑經(jīng)歷
這篇文章主要介紹了記一次webpack3升級webpack4的踩坑經(jīng)歷,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
?javascript學數(shù)組中的foreach方法和some方法
這篇文章主要介紹了?javascript學數(shù)組中的foreach方法和some方法,文章相關(guān)內(nèi)容和代碼詳細,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助2022-03-03
前端大文件分片下載具體實現(xiàn)方法(看這一篇就夠了)
本文介紹了在瀏覽器中下載大文件的技術(shù)方案,包括分片下載、斷點續(xù)傳、進度條顯示、取消及暫停下載和文件合并等功能,分片下載可以降低網(wǎng)絡傳輸中斷的風險,并減少內(nèi)存占用,需要的朋友可以參考下2024-10-10
BootStrap Validator 根據(jù)條件在JS中添加或移除校驗操作
這篇文章主要介紹了BootStrap Validator 根據(jù)條件在JS中添加或移除校驗的相關(guān)資料,需要的朋友可以參考下2017-10-10

