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>