关于JS事件的学习总结

鼠标事件

onclick  元素被点击时发生

onmousedown  鼠标按键被按下时发生

onmouseup  鼠标按键被松开时发生

oncontextmenu  用户右击鼠标时触发并打开上下文菜单

ondblclick   对象被双击时发生

键盘事件

onkeydown  用户按下一个键盘按键时发生

onkeypress  按下按键时触发

onkeyup  户释放键盘按钮时

添加事件的三种方式

1、通过html添加事件

<input type="button" click="alert(1)"/>

2、通过DOM0级方式添加事件

<input type="button" value="点击"/>

<script>

       var btn=;

       btn.onclick=function(){};

</script>

此方式添加事件的缺点是当添加同一个事件时,后写的会覆盖先写的。

清除事件时,只需让事件指向null。

3、通过DOM2级方式添加事件

document.addEventListener("click",function(){},true);

事件监听主要接受3个参数(事件类型,事件需要执行的函数,是否冒泡)

添加的相同事件不会覆盖前面的事件。

事件类型前面没有"on"。

最后一个参数为true代表捕获,false代表冒泡。

事件流(事件触发的时序问题)

1.事件冒泡:事件从事件源逐级向上传递(自下而上)

一般的事件绑定方式都是事件冒泡

html & js

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>event</title>
</head>
<body>
	<div onclick="alert('1');" >
		<p onclick="alert('2');">
			<span onclick="alert('3');">span 3</span>
			p 2
		</p>
		div 1
	</div>
</body>
</html>

css

<style>
body{
	margin:100px;
	padding:0;
}
div{
	background-color:red;
	width:200px;
	height:200px;
	}
p{
	width:100px;
	height:100px;
	background-color:blue;
}
span{
	display:block;
	width:50px;
	height:50px;
	background-color:yellow;
}
</style>

鼠标点击红色区域,弹出“1”;点击蓝色区域,相继弹出“2”“1”;点击黄色区域,相继弹出“3”“2”“1”。

2.事件捕获(自上而下)

document.addEventLisenter("click",function(){},true);

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>event</title>
</head>
<body>
	<div>		
		<p>
			<span>span 3</span>
			p 2
		</p>
		div 1
	</div>
	<script type="text/javascript">
		var div=document.getElementsByTagName('div')[0];
		var p=div.getElementsByTagName('p')[0];
		var span=p.getElementsByTagName('span')[0];
		var div1=document.getElementsByTagName('div')[1];
		div.addEventListener("click",alert('1'),true);
		p.addEventListener("click",alert('2'),true);
		span.addEventListener("click",alert('3'),true);
	</script>
</body>
</html>

样式同上。页面刷新时依次弹出1,2,3。

但是让我疑惑的是。

可是为什么页面刷新后再点击这些区域不会再触发事件,即添加的click事件只会在页面加载时触发一次,为什么会出现这种情况呢?

3.事件委托

利用冒泡的原理,把事件加到父级上,触发执行效果

好处: 1.批量处理元素事件添加,提高性能

          2.新添加的元素也会有之前的事件

html
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>event</title>
</head>
<body>
	<ul>
		<li>li-0</li>
		<li>li-1</li>
		<li>li-2</li>
		<li>li-3</li>
		<li>li-4</li>
		<li>li-5</li>
	</ul>
	<input type="button" value="添加li" name="">
</body>
</html>

css

<style>
body{
	margin:100px;
	padding:0;
}
ul{
	width:300px;
}
li{
	list-style-type: none;
	border: 1px solid black;
	margin-bottom:1px;
	background-color: yellow;
}
input{
	margin-left:130px;
}
</style>

js

	<script type="text/javascript">
		var ul=document.getElementsByTagName('ul')[0];
		var li=ul.getElementsByTagName('li');
		var input=document.getElementsByTagName('input')[0];
		for(var i=0;i<li.length;i++){
			input.onclick=function(){
				var newli=document.createElement("li");
				newli.innerHTML="newli";
				ul.appendChild(newli);
			}
			li[i].onmouseover=function() {
				this.style.background="white";
			}
			li[i].onmouseout=function() {
				this.style.background="yellow";
			}
		}
	</script>

鼠标移入任意 li,其背景变为白色;鼠标移出时变回黄色。且通过点击按钮新添加的 li 没有这些事件。

应用了事件委托的JS代码

    事件源:event对象,不管在哪个事件中,你操作的那个元素就是事件源

    ie:window.event.srcElement

    标准下:event.target

    nodename:找到元素的标签名

<script type="text/javascript">
		var ul=document.getElementsByTagName('ul')[0];
		var li=ul.getElementsByTagName('li');
		var input=document.getElementsByTagName('input')[0];
			input.onclick=function(){
				var newli=document.createElement("li");
				newli.innerHTML="newli";
				ul.appendChild(newli);
			}
			ul.onmouseover=function(ev) {
				var ev=ev;
				var target=ev.target;
				if(target.nodeName.toLowerCase()=="li"){
				target.style.background="white";}
			}
			ul.onmouseout=function(ev) {
				var ev=ev;
				var target=ev.target;
				if(target.nodeName.toLowerCase()=="li"){
				target.style.background="yellow";}
			}
	</script>

html,css效果同上。

从中体现了事件委托的两个优点:

    1.批量处理元素事件添加,提高性能; 2.新添加的元素也会有之前的事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值