选项卡面向对象练习

面向对象的选项卡 原则 :先写出普通的写法,然后改成面向对象写法

普通方法变型:

  尽量不要出现函数嵌套函数

  可以有全局变量

  把onload中不是赋值的语句放到单独函数中

改成面向对象:

      全局变量就是属性

  函数就是方法

  Onload中创建对象

  改this指向问题

下面是普通代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		*{margin:0;padding:0;}
		input{padding:5px 10px;}
		input.on{background: red;}
		#div1 div{width:200px;height:200px;border:1px solid #ccc;display: none;}
	</style>
</head>
<body>
	<div id="div1">
		<input class="on" type="button" value="1">
		<input type="button" value="2">
		<input type="button" value="3">
		<div style="display:block;">111</div>
		<div>222</div>
		<div>333</div>
	</div>
	<script>
		//普通写法
		/*window.onload = function(){
			var oParent = document.getElementById('div1');
			var aInput = oParent.getElementsByTagName('input');
			var aDiv = oParent.getElementsByTagName('div');
			for(var i = 0; i < aInput.length;i++){
				//给每个input添加一个自定义属性index = i;闭包传值
				aInput[i].index = i;
				aInput[i].onclick = function(){
					for(var i = 0;i<aInput.length;i++){
						aInput[i].className = '';
						aDiv[i].style.display='none';
					}
					this.className = 'on';
					aDiv[this.index].style.display='block';
				}
			}
		}*/

		/*
		普通方法先变型:
			尽量不要出现函数嵌套函数
			可以有全局变量
			把onload中不是赋值的语句放到单独函数中
		*/

		var oParent = null;
		var aInput = null;
		var aDiv = null;
		window.onload = function(){
			oParent = document.getElementById('div1');
			aInput = oParent.getElementsByTagName('input');
			aDiv = oParent.getElementsByTagName('div');

			init();
			
			function init(){
				for(var i = 0; i < aInput.length;i++){
					//给每个input添加一个自定义属性index = i;闭包传值
					aInput[i].index = i;
					aInput[i].onclick = change;
				}
			}
			function change(){
				for(var i = 0;i<aInput.length;i++){
					aInput[i].className = '';
					aDiv[i].style.display='none';
				}
				this.className = 'on';
				aDiv[this.index].style.display='block';
			}
		}
	</script>
</body>
</html>

面向对象改写如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		*{margin:0;padding:0;}
		input{padding:5px 10px;}
		input.on{background: red;}
		#div1 div,#div2 div{width:200px;height:200px;border:1px solid #ccc;display: none;}
	</style>
</head>
<body>
	<div id="div1">
		<input class="on" type="button" value="1">
		<input type="button" value="2">
		<input type="button" value="3">
		<div style="display:block;">111</div>
		<div>222</div>
		<div>333</div>
	</div>
	<hr>
	<div id="div2">
		<input class="on" type="button" value="1">
		<input type="button" value="2">
		<input type="button" value="3">
		<div style="display:block;">111</div>
		<div>222</div>
		<div>333</div>
	</div>
	<script>
		//普通写法
		/*window.onload = function(){
			var oParent = document.getElementById('div1');
			var aInput = oParent.getElementsByTagName('input');
			var aDiv = oParent.getElementsByTagName('div');
			for(var i = 0; i < aInput.length;i++){
				//给每个input添加一个自定义属性index = i;闭包传值
				aInput[i].index = i;
				aInput[i].onclick = function(){
					for(var i = 0;i<aInput.length;i++){
						aInput[i].className = '';
						aDiv[i].style.display='none';
					}
					this.className = 'on';
					aDiv[this.index].style.display='block';
				}
			}
		}*/

	/*
	改成面向对象
		全局变量就是属性
		函数就是方法
		Onload中创建对象
		改this指向问题
	*/


		window.onload = function(){
			var t1 = new Tab('div1');
			t1.init();
			var t2 = new Tab('div2');
			t2.init();
		};
		function Tab(id){
			this.oParent = document.getElementById(id);
			this.aInput = this.oParent.getElementsByTagName('input');
			this.aDiv = this.oParent.getElementsByTagName('div');
		}
		
		Tab.prototype.init = function(){
			var This = this;
			for(var i=0;i<this.aInput.length;i++){
				this.aInput[i].index = i;
				this.aInput[i].onclick = function(){
					This.change(this);
				};
			}
		};
		Tab.prototype.change = function(obj){
				for(var i = 0;i<this.aInput.length;i++){
					this.aInput[i].className = '';
					this.aDiv[i].style.display='none';
				}
				obj.className = 'on';
				this.aDiv[obj.index].style.display='block';
				
		}
	</script>
</body>
</html>

 效果如下:

 

 

posted @ 2017-05-01 23:34  front-gl  阅读(183)  评论(0编辑  收藏  举报