JavaScript学习笔记

事件委托

根据冒泡的原理,在table上加事件,在table区域点击,也必然点到了td的事件,td会冒泡上去,被table的事件捕捉。

这种子元素上不绑定事件,利用冒泡原理,冒泡到父元素上在执行的特点称为事件委托。即把子元素的事件委托给父元素。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	#container{
		width: 700px;
		height: 540px;
		margin:0 auto;
		border:1px solid blue;
		background: url('bg.png') no-repeat;
		padding-top: 7px;
		padding-left: 6px;
	}
	table{
		border-collapse: collapse;
		width: 700px;
		height: 525px; 
	}
	td{
		width: 20px;
		height: 30px;
		border-radius: 50%;
	}
	</style>
	<script type="text/javascript">
		window.onload = function t(){
			//闭包计棋器
			var cnt = (function(){
				var curr = 'black';
				return function(){
					var tmp = curr;
					curr = curr == 'black' ? 'white' : 'black';
					return tmp;
				}
			})();

			document.getElementsByTagName('table')[0].onclick = initAll;
			function initAll(ev){
				//target的就是当时点中的对象。
				if (ev.target.style.backgroundColor) {
					alert('此处已有棋');
					return;
				}
				ev.target.style.backgroundColor = cnt();
			}
		}
	</script>
</head>
<body>
<div id="container">
	<table>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
	</table>
</div>
</body>
</html>

背景图片
bg.png

五子棋

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>五子棋</title>
	<style type="text/css">
	#container{
		width: 700px;
		height: 600px;
		margin:0 auto;
		border:1px solid blue;
		background: url('bg.png') no-repeat;
		padding-top: 7px;
		padding-left: 6px;
	}
	table{
		border-collapse: collapse;
		width: 700px;
		height: 525px; 
	}
	td{
		width: 20px;
		height: 30px;
		border-radius: 50%;
	}
	</style>
	<script type="text/javascript">
		window.onload = function t(){
			//闭包计棋器
			var cnt = (function(){
				var curr = 'black';
				return function(){
					var tmp = curr;
					curr = curr == 'black' ? 'white' : 'black';
					return tmp;
				}
			})();

			document.getElementsByTagName('table')[0].onclick = initAll;
			function initAll(ev){
				xia.call(ev.target);
			}

			var tds = document.getElementsByTagName('td');
			var iswin = false;

			var xia = function(){
				if (iswin) {
					alert('下次再玩');
					return;
				}


				if (this.style.backgroundColor) {
					alert('此处已有棋');
					return;
				}
				var color=this.style.backgroundColor = cnt();
				judge.call(this,color);//下完棋后,判断胜负。
			}

            //判断胜负的函数
			var judge = function(color){
				//找到当前这颗棋的坐标
			    //alert('x:'+this.cellIndex+'y:'+this.parentElement.rowIndex);
			  var curr = {x:this.cellIndex,y:this.parentElement.rowIndex,color:color};
			  var line = {0:'',1:'',2:'',3:''};
			  //循环225个单元格
              for (var i = 0,temp={}; i < tds.length; i++) {

		        // console.log({x:tds[i].cellIndex,y:tds[i].parentElement.rowIndex});
		         //取当前循环到的这颗棋的坐标及其颜色,b(black),w(white),0(null)来表示
		         temp = {x:tds[i].cellIndex,y:tds[i].parentElement.rowIndex,color:'0'};

		         if(tds[i].style.backgroundColor=='black'){
		         	temp.color = 'b';
		         }else if(tds[i].style.backgroundColor=='white'){
		         	temp.color = 'w';
		         }

		         if (curr.y==temp.y) {//在一条横线上
		         	line[0] += temp.color;
		         }
		         if (curr.x==temp.x) {
		         	line[1] +=temp.color;
		         }
		         if ((curr.x+curr.y)==(temp.x+temp.y)) {
		         	line[2] +=temp.color;
		         }
		         if ((curr.x-temp.x)==(curr.y-temp.y)) {
		         	line[3] += temp.color;
		         }
			  }			 
			  //console.log(line);
			  //判断四条线上,有没有连续的4个w或者4个b
			  color = color=='black'?'bbbbb':'wwwww';
			  for(var i=0;i<4;i++){
			  	if(line[i].indexOf(color)>=0){
			  		color=color=='bbbbb'?'黑方胜!!!':'白方胜!!!';
			  		alert(color);
			  		iswin = true;
			  	}
			  }
			}
		}
	</script>
</head>
<body>
<div id="container">
	<table>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
	</table>
</div>
</body>
</html>