DOM 事件

JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。

网页中的每个元素都可以产生某些可触发JavaScript的事件。

事件三要素:事件源(事件被触发的对象),事件类型(如何触发什么事件),事件处理程序(通过一个函数赋值的方式完成)。

执行事件步骤:1.获取事件源    2.注册事件(绑定事件)    3.添加事件处理程序(采用函数赋值形式)

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		div {
			background-color: pink;
			width: 100px;
			height: 100px;
		}
	</style>
</head>

<body>
	<button>传统注册事件</button>
	<button>方法监听注册事件</button>

	<div>1</div>
	<div>2</div>
	<div>3</div>
	<script>
		//注册事件概述:给元素添加事件,称为注册事件或者绑定事件
		//注册事件有两种方式:传统方式和方法监听注册方式
		//传统注册方式:1.利用on开头的事件onclick
		//2.<button onclick='alert("hi~")'></button>
		//3.btn.onclick=function(){}
		//特点:注册事件的唯一性
		//同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
		//方法监听注册方式
		//1.w3c标准  推荐方式
		//2.addEventListener()它是一个方法
		//3.IE9之前的IE不支持此方法,可使用attachEvent()代替
		//特点:同一个元素同一个事件可以注册多个监听器
		//按注册顺序依次执行
		//addEventListener事件监听方式
		//eventTarget.addEventListener(type,listener[,useCapture])
		//eventTarget.addEvenLisenter()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
		//该方法接收三个参数:
		//1.type:事件类型字符串,比如click、mouseover,注意这里不要带on
		//2.listener:事件处理函数,事件发生时,会调用该监听函数
		//3.useCapture:可选参数,是一个布尔值,默认是false,学完DOM事件流后,我们再进一步学习
		var btns = document.querySelectorAll('button');
		//1.传统方式注册事件
		btns[0].onclick = function () {
			alert('hi');
		}
		btns[0].onclick = function () {
			alert('hhhh');
		}//兼容性还行,就是只能添加一次注册
		//2.事件侦听注册事件 addEventListener
		//(1).里面的事件类型是字符串  必定加引号 而且不带on
		//(2).同一个元素 同一个事件可以添加多个侦听器(事件处理程序)
		btns[1].addEventListener('click', function () {
			alert(666);
		})
		btns[1].addEventListener('click', function () {
			alert(888);
		})

		//删除事件(解绑事件)
		//1.传统注册方式
		var divs = document.querySelectorAll('div');
		divs[0].onclick = function () {
			alert(1111111);
			//1.传统方式删除事件  eventTarget.onclick = null;
			divs[0].onclick = null;
		}
		//2.方法监听注册方式  
		divs[1].addEventListener('click', fn)//里面的fn不需要调用加小括号
		//2.方法监听注册方式删除事件  eventTarget.removeEventListener(type,listener[,useCapture]);
		function fn() {
			alert(2222);
			divs[1].removeEventListener('click', fn);
		}

	</script>
</body>

</html>

事件流+阻止事件冒泡

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		.father {
			width: 200px;
			height: 200px;
			background-color: #FFC0CB;
			margin: 100px auto;
			position: relative;
		}

		.son {
			width: 150px;
			height: 150px;
			background-color: #7FFFD4;
			position: absolute;
			top: 0;
			right: 0;
			bottom: 0;
			left: 0;
			margin: auto;
		}
	</style>
</head>

<body>
	<div class="father">
		<div class="son">
			son盒子
		</div>
	</div>
	<script>
		//事件流描述的是从页面中接收事件的顺序
		//事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
		//DOM事件流分为3个阶段:1.捕获阶段  2.当前目标阶段  3.冒泡阶段
		//事件冒泡:IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程
		//事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程
		//注意:1.JS代码中只能执行捕获或者冒泡其中的一个阶段
		//2.onclick和attachEvent只能得到冒泡阶段。
		//3.addEventListener(type,listener[,useCapture])
		//第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;document -> html ->body -> father ->son
		//如果是false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。
		// var son=document.querySelector('.son');
		// son.addEventListener('click',function(){
		// 	alert('son');
		// },true);
		// var father=document.querySelector('.father');
		// father.addEventListener('click',function(){
		// 	alert('father');
		// },true);
		//4.冒泡阶段  如果是false或者 省略,表示处于冒泡阶段 son -> father -> body -> html ->document
		// var son=document.querySelector('.son');
		// son.addEventListener('click',function(){
		// 	alert('son');
		// },false);
		// var father=document.querySelector('.father');
		// father.addEventListener('click',function(){
		// 	alert('father');
		// },);
		// document.addEventListener('click',function(){
		// 	alert('document');
		// });
		//实际开发中很少使用事件捕获,更关注事件冒泡
		//有些事件是没有冒泡的,比如onblur、onfocus、onmouseenter、onmouseleave

		//阻止事件冒泡
		//.dom推荐的标准 stopPropagation()
		var son = document.querySelector('.son');
		son.addEventListener('click', function (e) {
			alert('son');
			e.stopPropagation();//阻止冒泡 stop停止 Propagation传播
		}, false);
		var father = document.querySelector('.father');
		father.addEventListener('click', function (e) {
			alert('father');
			e.stopPropagation();//阻止冒泡
		}, false);
		document.addEventListener('click', function () {
			alert('document');
		})
	</script>
</body>

</html>

事件委托

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>事件委托</title>
</head>

<body>
	<ul>
		<li>点染相思芙蓉盛开眉间</li>
		<li>点染相思芙蓉盛开眉间</li>
		<li>点染相思芙蓉盛开眉间</li>
		<li>点染相思芙蓉盛开眉间</li>
		<li>点染相思芙蓉盛开眉间</li>
	</ul>
	<script>
		//事件委托也称为事件代理,在jQuery里面称为事件委派
		//事件委托的原理:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。
		//事件委托的作用:只操作一次DOM,提高了程序的性能。
		var ul = document.querySelector('ul');
		ul.addEventListener('click', function (e) {
			//alert('点染相思芙蓉盛开眉间');
			//e.target 这个可以得到点击的对象 
			e.target.style.backgroundColor = 'pink';
		})
	</script>
</body>

</html>

常用的鼠标事件

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>some鼠标事件</title>
	<style type="text/css">
		body {
			height: 3000px;
		}
	</style>
</head>
<body>
	啊啊啊啊啊啊

	<script>
		//禁止鼠标右键菜单
		//contextmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单
		// document.addEventListener('contextmenu',function(e){
		// 	e.preventDefault();
		// })
		//禁止鼠标选中,禁止选中文字(selectstart 开始选中)
		// document.addEventListener('selectstart',function(e){
		// 	e.preventDefault();
		// })

		//鼠标事件对象
		//event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段主要用鼠标事件对象MouseEvent和键盘事件对象KeyboardEvent。
		document.addEventListener('click', function (e) {
			//1.client鼠标在可视区的x和y坐标
			console.log(e.clientX);//返回鼠标相对于浏览器窗口可视区的X坐标
			console.log(e.clientY);//返回鼠标相对于浏览器窗口可视区的Y坐标
			//2.page鼠标在页面文档的x和y坐标
			console.log(e.pageX);
			console.log(e.pageY);
			//3.screen鼠标在电脑屏幕的x和y坐标
			console.log(e.screenX);
			console.log(e.screenY);
		})
	</script>
</body>
</html>

鼠标事件:mouseenter 当鼠标移动到元素上时就会触发mouseenter事件

类似mouseover 区别于 mouseover鼠标经过自身盒子就会触发

                                    mouseenter只会经过自身盒子触发,因为mouseenter不会冒泡

跟mouseenter搭配的 鼠标离开事件mouseleave同样不会冒泡

    mouseover和 mouseout搭配

常用的键盘事件

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>some键盘事件</title>
</head>
<body>
	<script>
		//常用的键盘事件
		//1.keyup按键弹起的时候触发
		// document.onkeyup=function(){
		// 	console.log('我弹起咯');
		// }
		document.addEventListener('keyup', function () {
			console.log('我弹起了');
		})
		//2.keydown按键按下的时候触发
		document.addEventListener('keydown', function () {
			console.log('我按下了');
		})
		//3.keypress按键按下时触发(不识别功能键 比如ctrl shift 箭头等)
		document.addEventListener('keypress', function () {
			console.log('我按下了press');
		})
		//4.三个事件的执行顺序 keydown -- keypress --keyup
		//注意:如果使用addEventListener不需要加on

		//键盘事件对象中的keyCode属性可以得到相应键的ASCII码值
		//1.keyup和keydown事件不区分字母大小写 a和A得到的都是65
		//2.keypress事件区分字母大小写 a 97 A 65
		document.addEventListener('keyup', function (e) {
			console.log(e.keyCode);
			//可以利用keyCode返回的ASCII码值来判断用户按下了哪个键
			if (e.keyCode === 65) {
				alert('a');
			} else {
				alert('没有按a');
			}
		})
	</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值