原生js封装之路(一)

这几天比较空闲所以研究了一下封装的方法,对于我们这些小白来说,封装往往显得高大上,下面我就来讲解下我的封装之路。

原生js封装最简单的tab插件:

html 部分:写了两个包含框一个id为wrap一个为wraps

<div id="wrap">
	<ul id="diya">
		<li class="on">第一项</li>
		<li>第二项</li>
		<li>第三项</li>
	</ul>
    <br clear="all" />
	<div class="block">第一部分</div>
	<div class="none">第二部分</div>
	<div class="none">第三部分</div>
</div>
<div id="wraps">
	<ul id="diyas">
		<li class="on">第一项</li>
		<li>第二项</li>
		<li>第三项</li>
	</ul>
		<br clear="all" />
		<div class="block">第一部分</div>
		<div class="none">第二部分</div>
		<div class="none">第三部分</div>
</div>

css样式部分:

*{ padding:0; margin:0;}
.block{ display:block;}
.none{ display:none;}
#wrap,#wraps{ width:500px; height:230px; overflow:hidden; margin:50px auto;}
#diya,#diyas{ list-style:none;}
#diya li,#diyas li{ width:66px; height:28px; border:1px solid #09C; text-align:center; line-height:28px; float:left; cursor:pointer; margin-right:3px;}
#diyas li:hover{ background:#CCC;}
#diya li.on,#diyas li.on{ background:#9C3;}
#wrap div,#wraps div{ width:498px; height:198px; border:1px solid #000;}

js部分:

首先定义一个插件函数

function tab (id,navul,eve){

}
获取id值下对应的导航元素,和显示元素(此处的id对应的是包含框的id,navul对应的是nav的id,eve对应的事件类型)

function tab(id,navul,eve){
	var divs = document.getElementById(id).getElementsByTagName('div');
	var lis = document.getElementById(navul).getElementsByTagName('li');
}
事件函数判断(目前只判断点击click和mouseover事件)
// 两个for循环的解释:列如去超市买面包,有多个超市多个面包种类,想要将所有的面包都看一遍
// 第一次循环表示进入到超市中,第二个循环表示查看超市中每个种类的面包
for(var i=0;i<lis.length;i++){
	//确定下标
	lis[i].indx=i;
	// 判断eve的状态并且设置默认的变换方式
	if(eve=="click" || eve==null){
		// 当前li的点击事件函数
		lis[i].οnclick=function(){
		  for(i=0;i<lis.length;i++){
		//      清除所有的nav的li的className
		    lis[i].className="";
		// 将所有的显示内容的div隐藏
		    divs[i].className="none"
		//  当前的li的className赋值为on
		    this.className="on";
		// 当前的div的className赋值为Block
		    divs[this.indx].className="block";
		    }
		  }
	}else if(eve=="mouseover"){
		  lis[i].οnmοuseοver=function(){
		    for(i=0;i<lis.length;i++){
		    lis[i].className="";
		    divs[i].className="none";
		     
		    this.className="on";
		    divs[this.indx].className="block";
		      }
		    }
		  }
	}
完整代码:可以复制代码去测试一下效果

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>JS封装的选项卡TAB代码</title>
<style type="text/css">
*{ padding:0; margin:0;}
.block{ display:block;}
.none{ display:none;}
#wrap,#wraps{ width:500px; height:230px; overflow:hidden; margin:50px auto;}
#diya,#diyas{ list-style:none;}
#diya li,#diyas li{ width:66px; height:28px; border:1px solid #09C; text-align:center; line-height:28px; float:left; cursor:pointer; margin-right:3px;}
#diyas li:hover{ background:#CCC;}
#diya li.on,#diyas li.on{ background:#9C3;}
#wrap div,#wraps div{ width:498px; height:198px; border:1px solid #000;}
</style>
</head>
<body>
<div id="wrap">
	<ul id="diya">
		<li class="on">第一项</li>
		<li>第二项</li>
		<li>第三项</li>
	</ul>
    <br clear="all" />
	<div class="block">第一部分</div>
	<div class="none">第二部分</div>
	<div class="none">第三部分</div>
</div>
<div id="wraps">
	<ul id="diyas">
		<li class="on">第一项</li>
		<li>第二项</li>
		<li>第三项</li>
	</ul>
		<br clear="all" />
		<div class="block">第一部分</div>
		<div class="none">第二部分</div>
		<div class="none">第三部分</div>
</div>
</body>
</html>
<script type="text/javascript">
tab("wrap","diya","mouseover")    //对应的参数为包含框的id以及tab选项卡的id
tab("wraps","diyas")
function tab(id,navul,eve){
//tab效果封装,目前只有两种变换方式,一种为点击事件click(也是默认事件),另外一种为鼠标移过事件mouseover
var divs=document.getElementById(id).getElementsByTagName("div");
var lis=document.getElementById(navul).getElementsByTagName("li");
// 两个for循环的解释:列如去超市买面包,有多个超市多个面包种类,想要将所有的面包都看一遍
// 第一次循环表示进入到超市中,第二个循环表示查看超市中每个种类的面包
for(var i=0;i<lis.length;i++){
	//确定下标
	lis[i].indx=i;
	// 判断eve的状态并且设置默认的变换方式
	if(eve=="click" || eve==null){
		// 当前li的点击事件函数
		lis[i].οnclick=function(){
		  for(i=0;i<lis.length;i++){
		//      清除所有的nav的li的className
		    lis[i].className="";
		// 将所有的显示内容的div隐藏
		    divs[i].className="none"
		//  当前的li的className赋值为on
		    this.className="on";
		// 当前的div的className赋值为Block
		    divs[this.indx].className="block";
		    }
		  }
	}else if(eve=="mouseover"){
		  lis[i].οnmοuseοver=function(){
		    for(i=0;i<lis.length;i++){
		    lis[i].className="";
		    divs[i].className="none";
		     
		    this.className="on";
		    divs[this.indx].className="block";
		      }
		    }
		  }
	}
}
</script>

此处再添加上jq的tab组件的封装方法

html:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>tab组件的封装</title>
	<script src="jquery-1.11.3.min.js"></script>
	<script src="tab.js"></script>
	<style>
	*{margin:0;padding:0;}
	ul{list-style:none;}
		.con{
			position:relative;
			width:600px;
			height:600px;
			background:#f00;
		}
		.title{
			position:absolute;
			top:0;
			left:0;
			background:#f00;
			color:#fff;
		}
		.title ul li{
			float:left;
			width:50px;
			height:50px;
			line-height:50px;
			border:1px solid #f00;
		}
		.detail{
			width:600px;
			height:550px;
			position:absolute;
			top:50px;
			left:0;
			background:#ddd;
		}
		.con1,.con2,.con3{
			position:absolute;
			top:0;
			left:0;
			width:600px;
			height:550px;
			color:#fff;
		}
		.con1{
			background:#f00;
		}
		.con2{
			background:yellow;
		}
		.con3{
			background:blue;
		}
		.active{
			background:#ddd;
			display:block;
		}
		.tab_item{
			display:none;
		}

	</style>
</head>
<body>
	<!--data-config传的配置参数-->
	<div class="con" id="tab" data-config='{  
            "type":"click",  
            "effect":"fade",  
            "show":1,  
            "auto":1000}'>
			<div class="title">
				<ul class="nav">
					<li class="active">tab1</li>
					<li>tab2</li>
					<li>tab3</li>
				</ul>
			</div>
			<div class="detail">
				<div class="con1 tab_item">第一页</div>
				<div class="con2 tab_item">第二页</div>
				<div class="con3 tab_item">第三页</div>
			</div>

		</div>
		<script>
			$('#tab').Tab(tab);
		</script>
</body>
</html>



js部分(可以直接外部引用)

(function($){
	
	function Tab(tab){
		this.tab = tab;
		var me = this; //留住this
		this.config={
			type:'click',
			effect:'default'
		};
		
		console.log(this.config.type);
		//将自己设置的参数和默认的config合并保留最新的
		this.getConfig()&&$.fn.extend(this.config,this.getConfig());
		this.tabNav = this.tab.find('.nav li');
		this.tabItem= this.tab.find('.tab_item');
		if(this.config.type == 'click'){
			this.tabNav.bind(this.config.type,function(e){
				me.currentChange($(this));
			})
		}else{
			this.tabNav.bind('mouseover',function(){
					me.currentChange($(this));
			})
		}
	}

	Tab.prototype={
		// 获得配置参数
		getConfig:function(){
			var config = this.tab.attr('data-config');
			if(config&&config!=null){
				return($.parseJSON(config));
			}else{
				return null;
			}
		},
		currentChange:function(cur){
			var index = cur.index();
			cur.addClass('active').siblings().removeClass('active');
			if(this.config.effect==="default"){  
	                this.tabItem.eq(index).addClass("active").siblings().removeClass("active");//为当前元素添加active,移除兄弟元素的active  
	         }else if(this.config.effect==="fade"){  
	                this.tabItem.eq(index).stop().fadeIn().siblings().stop().fadeOut();  
	         }  
		}
	}
	

// 扩展参数到jQuery方法上,实现链式调用,如$('xx').Tab().css()  
    $.fn.extend({  
        Tab:function(){  
            this.each(function(){  
                new Tab($(this));  
            });  
            return this; //jQuery链式调用  
        }  
    });  
    // 注册全局变量  
    window.Tab=Tab;  

})(jQuery)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值