day06_JS事件

一、事件的概念

1、事件的概念

在JS中的事件是:用户在页面上操作,然后我们要调用函数来处理。

事件触发:用户在页面上操作 就是事件触发

2、事件的模式

内联模式

直接在HTML标签中添加事件

<body>
    <input type='button' value='按钮' onclick='alert("hello");' />
    <!-- 执行自定义的JS函数 -->
    <input type='button' value='按钮' onclick='btnClick();' />
</body>

脚本模式

将JS代码和HTML代码分离,符合代码规范

<body>
    <script type="text/javascript">
        var box = document.getElementById('box');
        // 添加方式一 通过匿名函数,直接触发对应的代码(推荐)
        box.onclick = function(){
            console.log('hello world');
        }
        // 添加方式二:通过指定的函数名赋值方式 来执行函数
        box.onclick = func;
        function func(){
            console.log('hello world');
        }
        
    </script>
</body>

3、事件的组成

完整事件由三部分组成:

  1. 触发事件的元素节点对象
  2. 事件处理函数
  3. 事件执行函数

所有事件处理函数都会有两个部分组成:on+事件类型

二、事件的分类

1、鼠标事件

鼠标事件描述
click当单击鼠标按钮并在松开时触发
dbclick当双击鼠标按钮时触发
mousedown当按下了鼠标还未松开时触发
mouseup释放鼠标按钮时触发
mouseover当鼠标移入某个元素的那一刻触发
mouseout当鼠标刚移出某个元素的那一刻触发
mousemove当鼠标指针在某个元素上移动时触发
mouseenter当鼠标移入某个元素的那一刻触发
mouseleave当鼠标刚移出某个元素的那一刻触发

mouseover和mouseenter的区别

mouseover,元素的子元素的移入也会触发事件

mouseenter:元素的子元素的移入不会触发事件

mouseout:元素的子元素的移出也会触发事件

mouseleave:元素的子元素的移出不会触发事件

循环中事件的下标

在JS事件中,this表示触发事件的元素节点对象

不用this,如果用for循环定义事件会产生bug

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<img src="img/1.jpg" alt="" >
		<img src="img/2.jpg" alt="" >
		<img src="img/3.jpg" alt="" >
		<hr >
		<img src="img/1.jpg" alt="" id='show'>
		<hr >
		<script type="text/javascript">
			var show = document.getElementById('show');
			var imgs = document.getElementsByTagName('img');
			var srcs = ["img/1.jpg","img/2.jpg","img/3.jpg"];
			for(var i=0;i<imgs.length-1;i++){
				imgs[i].onclick = function(){
					// 代码执行先后顺序的bug
					// show.src = srcs[i];    //bug的产生
					// 因为触发的时候i已经循环到3了 for循环已经执行完了
					show.src = this.src;
				}
			}
			
			// 第二种解决bug的方法
			// for(var i=0;i<imgs.length-1;i++){
			// 	imgs[i].index = i;
			// 	imgs[i].onclick = function(){
			// 		show.src = srcs[this.index];
			// 	}
			// }
		</script>
	</body>
</html>

2、键盘事件

在键盘上按下键时触发的事件

键盘事件描述
keydown当用户按下键盘上某个键触发,如果按住不放,会重复触发
keypress当用户按下键盘上字符键触发,如果按住不放,会重复触发
keyup当用户释放键盘上的某个键触发

3、HTML事件

HTML事件描述
load当页面完全加载后触发
unload当页面完全卸载后触发
select当用户选择文本框后的内容触发
change当文本框内容改变且失去焦点后触发
focus当页面或者元素获得焦点时触发
blur当页面或元素失去焦点时触发
scroll当用户滚动带滚动条的元素时触发

三、事件的对象

1、事件的对象是什么?

event对象是在触发事件时,浏览器会通过函数把事件对象作为参数传递过来

<body>
   <script type="text/javascript">
       var box = document.getElementById('box');
       box.onclick = function(event){
           console.log(event);
       }
    </script>
</body>

2、事件对象的属性

2.1 button鼠标属性

说明
0表示主鼠标按钮(鼠标左键)
1表示中间的鼠标按钮(鼠标滚轮)
2表示次鼠标按钮
<body>
   <script type="text/javascript">
       var box = document.getElementById('box');
       box.onclick = function(event){
           console.log(event.button);
       }
    </script>
</body>

2.2 坐标属性

属性说明
clientX浏览器可视区域的x坐标
clientY浏览器可视区域的y坐标
pageX浏览器内容区域的x坐标
pageY浏览器内容区域的y坐标
screenX显示器屏幕的x坐标
screenY显示器屏幕的y坐标
offsetX鼠标点击的元素位置距离元素左边界的x坐标
offsetY鼠标点击的元素位置距离元素左边界的y坐标

2.3 键盘事件的组合键

属性说明
shiftKey判断是否按下了shift键
ctrlKey判断是否按下了ctrl键
altKey判断是否按下了alt键

2.4 编码属性

keyCode

所有按键在发生keydown和keyup事件时,event对象的keycode属性中会包含一个代码,与键盘上一个特定的键对应,对数字字母键,keyCode属性的值与ASCII码中对应,但是字母键的编码均为大写字母的编码

charCode

使用keypress事件才会得到charCode,区分大小写

也可以使用String.fromCharCode()将编码转换成实际的字符

四、事件流

事件流是描述的从页面接收事件的顺序,具体是隧道式获取,冒泡式触发。

事件流包括两种模式:冒泡和捕获。

1、阻止事件冒泡

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#container{
				height: 400px;
				width: 400px;
				border: 1px red solid;
			}
			#box1{
				height: 200px;
				width: 200px;
				border: 1px solid green;
			}
			#box2{
				height: 100px;
				width: 100px;
				border: 1px solid blue;
			}
		</style>
	</head>
	<body>
		<div id="container">
			<div id="box1">
				<div id="box2">
				</div>
			</div>
		</div>
		<script type="text/javascript">
			container = document.getElementById('container');
			box1 = document.getElementById('box1');
			box2 = document.getElementById('box2');
			container.onclick = function(){
				console.log('container click');
			}
			box1.onclick = function(){
				console.log('box1 click');
			}
			box2.onclick = function(event){
				console.log('box2 click');
			}
		</script>
	</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnRgXonT-1597147995702)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20200811194233262.png)]

这是以上代码执行的结果
按box2  控制台由内而外输出
阻止事件冒泡的方法是:停止传播  event.stopPropagetion();
在指定不想在继续传递事件的节点的事件执行函数中使用

2、事件监听器

2.1 添加事件监听器

box.addEventListener('click',func,false)
第一个参数:事件名称
第二个参数:事件执行函数名称
第三个参数:是否使用捕捉,反向冒泡

2.2 移除事件监听器

box.removeEventListener('click',func)

3、阻止右键菜单

想要创建自己的右键菜单,则需要先阻止默认的右键菜单

<script type="text/javascript">
    document.oncontextmenu = function(){
        console.log('右键被按下');
        return false;
    }
</script>

五、拖拽

1、实现拖拽相关的三大事件

onmousedown onmousemove onmouseup

2、实现拖拽思路

  1. 给目标元素添加onmousedown事件

    在鼠标按下的瞬间,记录鼠标所在位置与目标元素左边界的距离disX,以及与上边界的disY

  2. 当第一步发生之后,就给document添加onmousemove事件,

    不断刷新目标元素的位置

  3. 在第二步发生之后,给document添加onmouseup事件,

    取消onmousemove事件

<script>
    onload = function() {
    var box = document.getElementById("box");
    //鼠标按下
    box.onmousedown = function(evt) {
        var e = evt || event;
        //计算鼠标位置与div左边和上边的距离
        var disX = e.offsetX;
        var disY = e.offsetY;
        //鼠标移动
        document.onmousemove = function(evt) {
            var e = evt || event;
            box.style.left = e.clientX - disX + "px";
            box.style.top = e.clientY - disY + "px";
        }
        //鼠标松开
        document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
        }
    }
}

</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值