6.JavaScript核心BOM操作学习(界面交互功能)——通过JavaScript完成各种事件(包括各种鼠标、键盘事件)

②删除事件

1.传统注册事件
eventTarget.οnclick=null;
2.方法监听注册事件
eventTarget.removeEventListener(type,listener[,useCapture]);

<style>
	div{
		width:100px;
		height:100px;
		background-color:pink;
	}
</style>
<body>
	<div>
		1
	</div>
	<div>
		2
	</div>
	<div>
		3
	</div>
	<script>
		var div = document.querySelectorAll('div');
		//①传统方式注册和删除
		div[0].onclick=function(){
			alert('点击事件1');
			this.onclick=null;
		}
		//②监听方式的注册

		div[1].addEventListener('click',function(){
			alert('点击事件2');
		})
		
		//③监听方式的删除
		function fn(){
			alert('点击事件3');
			div[2].removeEventListener('click',fn);
		}
		div[2].addEventListener('click',fn)
		
	</script>
</body>


③DOM事件流

事件流描述的是从页面中接受事件的顺序
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流

比如给div注册了点击事件
DOM事件流分为三个阶段
1.捕获阶段
2.当前目标阶段
3.冒泡阶段
来自黑马教育
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
注意:
1.JS代码中只能执行捕获或者冒泡其中的一个阶段
2.onclick和attachEvent只能得到冒泡阶段
3.捕获阶段,如果addEventListener 第三个参数是true,那么则处于捕获阶段
4.冒泡阶段,如果addEventListener 第三个参数是true,那么则处于冒泡阶段(更加关注)
5.有些事情是没有冒泡的,比如onblur,onfocus,onmouseenter,onmouseleave

<style>
	.father{
		margin:0px auto;
		width:200px;
		height:200px;
		background-color:pink;
		border:1px solid #fff;
	}
	.son{
		margin:auto;
		width:150px;
		height:150px;
		background-color:blue;
		margin-top:25px;
	}
</style>
<body>
	<div class="father">
		<div class="son">盒子</div>
	</div>
	<script>
	
		var son = document.querySelector('.son');
		var father = document.querySelector('.father');
		
		//捕获阶段 document->html->body->father->son
		son.addEventListener('click',function(){
			alert('son');
		},true);
		father.addEventListener('click',function(){
			alert('father');
		},true);
		//冒泡阶段 如果addEventListener第三个参数是false或者省略那么处于冒泡阶段
		son.addEventListener('click',function(){
			alert('son');
		},false);
		father.addEventListener('click',function(){
			alert('father');
		},false);
		
	</script>
</body>


④事件对象(重要)

官方解释:
event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态
简单理解:
事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,他有很多属性和方法

<body>
<div style="width:100px; height:100px; background-color:pink">
	点击触发事件
</div>
<div style="width:100px; height:100px; background-color:pink">
	点击通过监听触发
</div>
<script>
	//事件对象
	var div = document.querySelectorAll('div');
	
	
	//1.event就是一个事件对象,写道我们侦听函数的小括号里面,当形参来看
	//2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
	//3.事件对象是我们时间的一系列相关数据的集合 跟事件相关的 
		//比如鼠标点击里面就包含了鼠标的相关信息,比如鼠标坐标
		//如果是键盘事件里面就包含的键盘事件的信息,比如判断用户按下了哪个键
	//4.这个事件对象可以自己命名,比如event、evt、e
	//5.事件对象也有兼容性问题,ie678通过window.event
	
	//传统注册事件
	div[0].onclick=function(event){
		console.log(event);
		
		//兼容ie678 版本方法
		console.log(window.event);
		
		//解决兼容性问题
		e=e||window.event;
		console.log(e);
	}
	
	//监听注册事件
	div[1].addEventListener('click',function(event){
		console.log(event);
	})
</script>
</body>
⑤target和this的区别

e.target:返回的是触发事件的对象,
this:绑定哪个触发事件就返回哪一个

<body>
	<div style="width:100px;height:100px;background-color:pink;">
		这是一个盒子
	</div>
	<ul>
		<li>1</li>
		<li>2</li>
		<li>3</li>
		<li>4</li>
	</ul>
	<script>
		var div=document.querySelector('div');
		var ul = document.querySelector('ul');
		div.addEventListener('click',function(e){
			console.log(e.target);
			console.log(this);
		})
		
		ul.addEventListener('click',function(e){
			console.log(e.target);
			console.log(this);
		})
	</script>
</body>

常见的事件对象属性方法
在这里插入图片描述

⑥阻止事件冒泡

事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
stopPropagation()

<style>
	.father{
		margin:0px auto;
		width:200px;
		height:200px;
		background-color:pink;
		border:1px solid #fff;
	}
	.son{
		margin:auto;
		width:150px;
		height:150px;
		background-color:blue;
		margin-top:25px;
	}
</style>
<body>
	<div class="father">
		<div class="son">盒子</div>
	</div>
	<script>
	
		var son = document.querySelector('.son');
		var father = document.querySelector('.father');
		
		//捕获阶段 document->html->body->father->son
		son.addEventListener('click',function(){
			alert('son');
		},true);
		father.addEventListener('click',function(){
			alert('father');
		},true);
		//冒泡阶段 如果addEventListener第三个参数是false或者省略那么处于冒泡阶段
		son.addEventListener('click',function(e){
			alert('son');
			<!----------------阻止冒泡------------------------>
			e.stopPropagation();
		},false);
		father.addEventListener('click',function(){
			alert('father');
		},false);
		
	</script>
</body>
⑦事件委托(代理、委派)

事件委托也称为时间代理,在jQuery里面称为事件委派
事件委托原理
不是给每个子节点单独设置事件监听器,而是事件监听器设置在其父结点上,然后利用冒泡原理影响设置每个子节点
案例
例如:给ul注册点击事件,然后利用事件对象的target来找到当前点击的li,因为点击li,事件会冒泡到ul上,ul有注册事件,就会触发事件监听器

<body>
	<ul>
		<li>1</li>
		<li>2</li>
		<li>4</li>
		<li>3</li>
		<li>5</li>
	</ul>
	<script>
		var ul = document.querySelector('ul');
		ul.addEventListener('click',function(e){
			alert('quququuquq');
			e.target.style.backgroundColor='pink';
		})
	</script>
</body>
⑧常用鼠标键盘事件

onclick:鼠标点击左键触发
onmouseover:鼠标经过触发
onmouseout:鼠标离开出发
onfocus:获得鼠标焦点出发
onblur:失去鼠标焦点触发
onmousemove:鼠标移动触发
onmouseup:鼠标弹起触发
onmousedown:鼠标按下触发

1.禁止鼠标右键菜单

contextmenu主要控制应该何时显示上下文,主要用于程序员取消默认的上下文的菜单

document.addEventListener('contextmenu',function(e){
	e.preventDefault();
})

2.禁止鼠标选中

selectstart开始选中

document.addEventListener('selectstart',function(e){
	e.preventDefault();
})

3.鼠标和键盘事件对象
event对象代表事件的状态,跟事件相关的一系列信息的集合,现阶段主要用
鼠标事件对象 MouseEvent

         e.clientX
         e.clientY
clint鼠标相对于浏览器可视区的x和y坐标
         e.pageX
         e.pageY
page鼠标相对于文档页面的x和y坐标(IE9+支持)
         e.screenX
         e.screenY
screen鼠标相对于电脑屏幕的x和y坐标
可以回顾一下本文章的④事件对象

<body>
<div style="width:100px; height:100px; background-color:pink">
	点击触发事件
</div>
<div style="width:100px; height:100px; background-color:pink">
	点击通过监听触发
</div>
<script>
	//事件对象
	var div = document.querySelectorAll('div');
	
	//传统注册事件
	div[0].onclick=function(event){
		console.log(event.clientX);
		console.log(event.clientY);
	}
	
	//监听注册事件
	div[1].addEventListener('click',function(event){
		console.log(event.clientX);
		console.log(event.clientY);
	})
</script>
</body>

键盘事件对象: keyboardEvent
         onkeyup:某个键盘按键被松开时触发
         onkeydown:某个键盘按键被按下时触发(识别功能键)
         onkeypress:某个键盘按键被按下时触发(不识别功能键:ctrl shift等)

执行顺序:keydown->keypress->keyup

<body>
	<script>
		document.addEventListener('keyup',function(){
			console.log('我弹起了');
		})
		document.addEventListener('keydown',function(){
			console.log('我按下了down');
		})
		document.addEventListener('keypress',function(){	
			console.log('我按下了press');
		})</script>
</body>



4.案例:跟随鼠标移动

<style>
	img{
		position:absolute;
		width:10px;
		height:10px;
	}
</style>
<body>
	<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1934942912,2600722552&fm=26&gp=0.jpg" alt>
	<script>
		var img=document.querySelector('img');
		document.addEventListener('mousemove',function(e){
			var x=e.pageX;
			var y = e.pageY;
			//不要忘记
			img.style.left=x+'px';
			img.style.top=y+'px';
		});
	</script>
</body>

5.案例:判断用户按下哪个键

<body>
	<script>
		document.addEventListener('keyup',function(e){
			console.log('Up'+e.keyCode);
			//弹起键盘的ASCII值
			//1.keyup呵keydown事件不区分大小写,a和A得到的都是65
			//1.keypress事件区分字母大小写
		})
		document.addEventListener('keypress',function(e){
			console.log('Press:'+e.keyCode);
			//弹起键盘的ASCII值
			//1.keyup呵keydown事件不区分大小写,a和A得到的都是65
			//1.keypress事件区分字母大小写
		})
	</script>
</body>


今天学完了,之前落下的太多,七天肯定学不完了
可能完了我会把标题改了,看看一个正常人无JavaScript基础,有C语言和HTML基础能多久学的很踏实

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值