JavaScript中的事件流(事件冒泡/捕获),事件的兼容(事件的绑定/移除,阻止冒泡/默认),闭包及闭包的应用,定时器

事件流

事件流的介绍:
事件流描述的是从页面中接收事件的顺序.
事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候,那么你点击其中一个元素,并不是只有当前被点击的元素会触发事件,而层叠在你点击范围的所有元素都会触发事件.
事件流包括两种模式:事件冒泡和事件捕获.
事件冒泡:是值子元素和父元素具备同样的事件,当触发子元素的事件时,也会触发父元素的事件(由内至外).子集元素先触发,父级元素后触发.
事件捕获:与事件冒泡相反,父级元素先触发,子集元素后触发.

<head>
		<meta charset="utf-8" />
		<title></title>
		<style type="text/css">
			.div_01{
				width: 300px;
				height: 300px;
				background: red;
			}
			.div_02{
				width: 150px;
				height: 150px;
				background: aqua;
			}
		</style>
		<script type="text/javascript">
			window.function(){
			var div_01=document.getElementsByClassName('div_01')[0];
			var div_02=document.getElementsByClassName('div_02')[0];
			var arr_01=[div_02,div_02,document,document.body];
			for(var i=0;i<arr_01.length;i++){
				arr_01[i].function(){
					console.log(this);
				}
				          }
			}
		</script>
	</head>
	<body>
		<button id="but1">按钮1</button>
		<button id="but2">按钮2</button>
		<div class="div_01">
			<div class="div_02"></div>
		</div>
	</body>

事件兼容

事件的绑定
语法:
第一个参数是事件的类型(如 “click” 或 “mousedown”).
第二个参数是事件触发后调用的函数。
第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。
注意:不要使用 “on” 前缀.例如,使用 “click” ,而不是使用 “onclick”.
通过 addEventListener(添加点击事件监听器)形式的绑定事件不 会互相抵消,从而实现一个按钮控制多个事件。

<script type="text/javascript">
	window.function(){
		var btn2=document.getElementById('btn2');
		btn2.addEventListener('click',function(){
			alert('第一个');
		},false);
		btn2.addEventListener('click',function(){
			alert('第二个');
		},false);
</script>		
<body>
	<button id="btn2">按钮 2</button>
</body>

事件的移除
想要移除一个元素的事件,前提条件事件处理程序必须是一个有名称的函数

<script type="text/javascript">
	window.function(){
		var btn1=document.getElementById('btn1');
		btn1.addEventListener('click',show,false);
		function show(){
			alert('第一个');
		}
		btn1.removeEventListener('click',show,false);//事件的移除
	}
</script>
<body>
	<button id="btn1">按钮 1</button>
</body>

阻止冒泡
语法结构:
事件对象.stopPropagation()

<style type="text/css"> 
	.box1 {
		border: green 40px solid;
		width: 300px;
		height: 300px;
		margin: auto;
	}
	.box2 {
		border: yellow 40px solid;
		width: 220px;
		height: 220px;
		margin: auto;
	}
	span {
		position: relative;
		left: 50px;
		top: 50px;
		background-color: rgba(128, 128, 128, 0.22);
	}
</style>
<script type="text/javascript">
	window.function(){
		document.getElementById('box1').addEventListener('click',function(event){
			alert('最外层div');
		});
		document.getElementById('box2').addEventListener('click',function(event){
			alert('第二层div');
		});
		document.getElementById('span').addEventListener('click',function(event){
			alert('最里面span元素');
			event.stopPropagation(); //阻止事件冒泡
		});
	}
</script>
<body id="body">
	<div id="box1" class="box1">
		<div id="box2" class="box2">
			<span id="span">This is a span.</span>
		</div>
	</div>
</body>

阻止默认
语法结构:
事件对象.preventDefault()

<script type="text/javascript">
	window.function(){
		var a1=document.getElementsByTagName('a')[0];
		a1.addEventListener('click',function(evevt){
			if(event.preventDefault()){
				event.preventDefault();
			}else{
				window.event.returnValue=false;
			}
		})
	}
</script>
<body>
	<a  href="https://www.baidu.com" target="_blank">百度</a>
</body>

闭包及闭包的应用

事件闭包的理解:闭包是指有权限访问另一个函数作用域中的变量的函数.在 javascript 语言中,闭包就是函数和该函数作用域的组合.在JavaScript中任何一个函数都是一个闭包,但是嵌套的函数功能更强(闭包的作用更加强大,产生一个作用域链)
变量的作用域:要理解闭包,首先必须理解 Javascript 特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.
Javascript 语言的特殊之处,就在于函数内部可以直接读取全局 变量.另一方面,在函数外部自然无法读取函数内的局部变量.
注:在函数内部声明变量的时候,一定要使用var命令.如果不用的话,你实际上声明了一个全局变量!不如写在函数之外.
如何从外部读取局部变量:
出于种种原因,我们有时候需要得到函数内的局部变量.但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才 能实现. 那就是在函数的内部,再定义一个函数.
父对象的所有变量,对子对象都是可见的,反之则不成立,从而形成js中特殊的作用域链 scope chain;

<script type="text/javascript">
	function rengh(){
		var color='yellow';
		var width=200+'px';
		var height=300+'px';
		function linggh(){
			return color;
		}
		return linggh();
	}
	alert(rengh());
</script>

闭包的再一次理解:
闭包就是能够读取其他函数内部变量的函数;由于在 Javascript 语言中,只有函数内部的子函数才能读取局部 变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”. 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁.
闭包的应用:
闭包可以使用在许多地方.它的最大作用有两处,一个是前面提到 的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.

<script type="text/javascript">			
	function Student(){
		var color='yellow';
		var height=1.82;
		var weight=60;
		
		//第一种方法 不常用(不强大);
		//return '肤色:'+color+'身高:'+height+'体中:'+weight;
		//第二种方式: 通过在函数体内定义函数 返回,功能更加强大
		function Student_01(){
			return '肤色:'+color+'身高:'+height+'体中:'+weight;
		}
		return Student_01();
	}
//	对于以上案例: Student_01() 就是一个闭包函数
//	闭包就是能够读取其他函数内部变量的函数
	//有个老师对象 想访问学生对象的属性(详细信息)
	function Teacher(){
		alert(Student());
	}
	Teacher();
	/*闭包可以使用在许多地方.它的最大作用有两处:
		一个是前面提到的可以读取函数内部的变量,
		另一个就是让这些变量的值始终保持在内存中*/
</script>

定时器

定时器有以下两种方法:
SetInterval():按照指定的周期(以毫秒计)来调用函数或计算表达式,方法会不停的调用函数,直到clearInterval()被调用或者窗口被关闭.
SetTimeout():在指定的毫秒数后调用函数或计算表达式.
setInterval();循环定时器:固定时间间隔指定一次,像闹钟 一样,不关闭继续执行.
语法结构
setInterval(code,millisec,lang)
code: 必需。要调用的函数或要执行的代码串。
millisec:必须。周期性执行或调用 code 之间的时间 间隔,以毫秒计
lang: 可选。 JScript | VBScript | JavaScript

每三秒弹出一个 hello

<script type="text/javascript">
	var time=setInterval(function(){//循环定时器
		document.write('hello');
	},3000)
</script>

显示当前时间,通过按钮实现时间的停止,开始

<script type="text/javascript">
	var mytimer;
	function startTimer(){
		mytimer=setInterval('myDate()',1000);	
	}
	function myDate(){
		var timeDate=new Date();//获取当前时间
		var times=timeDate.toLocaleTimeString();//将日期时间转换为字符串类型
		document.getElementById('demo').innerHTML=times;
	}
	function stopTimer(){
		clearInterval(mytimer);
	}
</script>
<body>
	<h4 id="demo">setInterval()计时器函数</h4>
	<input type="button" "startTimer()" value="开始"/>
	<input type="button" "stopTimer()" value="停止" />
</body>

**SetTimeout();**炸弹定时器:只执行一次,不能执行下一次了.
实现一个页面的简易版时钟

<script type="text/javascript">
	function startTime(){
		var today=new Date();
		var h=today.getHours();
		var m=today.getMinutes();
		var s=today.getSeconds();
		m=ghTime(m);
		s=ghTime(s);
		document.getElementById('txt').innerHTML=h+':'+m+':'+s;
		t = setTimeout('startTime()', 500);
	}
	function ghTime(i){
		if(i < 10){
			i='0'+i
		}
		return i;
	}
</script>
<body "startTime()">
	<div id="txt"></div>
</body>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值