目录
一、事件绑定三要素
1.1 标签对象
事件源 也就是绑定事件的标签对象
1.2 事件类型
也就是绑定给标签对象的事件的类型,例如“click”等
1.3 事件处理函数
也就是触发事件时执行的函数,是回调函数语法形式,可以是函数名称可以是匿名函数。例如“function(){}”。
1.4 事件绑定语法形式
1.4.1 语法形式一
事件监听标签 对象.addEventListener( 'click' , function(){})
1.4.2 语法形式二
on语法绑定 标签对象.onclick = function(){}
1.4.3 on语法 和 事件监听语法的区别
on语法 是 通过 = 等于赋值 绑定的事件处理函数
= 等于赋值 本质上执行的是 覆盖赋值
后赋值的数据会覆盖之前存储的数据
也就是 on语法 一个 标签对象 相同的事件类型
只能 赋值绑定 一个 事件处理函数
如果 赋值绑定 多个事件处理函数
后赋值 的事件处理函数 会 覆盖之间存储的事件处理函数
最终 执行 最后赋值个事件处理函数
代码演示:
<body>
<div>点击</div>
<script>
const oDiv = document.querySelector("div");
// 第一种语法形式
oDiv.addEventListener("click",function(){
console.log("大聪明码农徐");
})
// 第二种语法形式
oDiv.onclick = function(){console.log("大聪明码农徐");}
// = 等于赋值 本质上执行的是 覆盖赋值
// 执行 最后赋值个事件处理函数
oDiv.onclick = function(){console.log(666666);}
</script>
</body>
运行结果:
1.5 事件绑定语法兼容
1.5.1 标准浏览器
标签对象.addEventListener( 'click' , function(){})
1.5.2 低版本IE浏览器
标签对象.attachEvent('onclick' , function(){});
二、事件的删除
2.1 on语法绑定事件的删除
标签对象.on事件类型 = null ;
标签对象.on事件类型 = function(){} ;
触发事件时 就没有调用执行的函数程序
达到删除事件的效果
2.2 事件监听语法的删除
需要调用专门的删除函数方法
标签对象.removeEventListener( '事件类型' , 事件处理函数 );
标签对象.detachEvent( 'on'事件类型 , 事件处理函数);
注意: 使用专门的函数方法 删除绑定的事件处理函数, 只能删除 绑定的函数名称 不能删除 绑定的匿名函数
代码演示:
<body>
<div>点击</div>
<script>
const oDiv = document.querySelector("div");
// 使用专门的函数方法 删除绑定的事件处理函数
// 只能删除 绑定的函数名称 不能删除 绑定的匿名函数
// 定义函数
function fun(){
console.log("大聪明码农徐");
}
//回调函数调用函数
oDiv.addEventListener("click",fun);
// 只能删除 绑定的函数名称
oDiv.removeEventListener("click",fun);
// 不能删除 绑定的匿名函数
// 所以后台输出123456789仍会执行
oDiv.addEventListener("click",function(){
console.log(123456789);
})
oDiv.removeEventListener("click",function(){
console.log(123456789);
})
oDiv.onclick = function(){console.log("大聪明码农徐");}
// on语法绑定事件的删除
oDiv.onclick = null;
</script>
</body>
运行结果:
三、默认事件的阻止
3.1 定义
a标签的点击跳转,form标签的点击提交,鼠标右键菜单都属于默认事件
3.2 阻止默认事件
在事件处理函数中定义一个形参 形参名称一般是 e / event
标签对象.addEventListener('事件类型' , function( e / event ){
// 阻止默认事件执行
形参.preventDefault() ;
})
代码演示:
<body>
<script>
// 获取标签对象
const oBody = document.querySelector("body");
// contextmenu 鼠标右键点击事件
oBody.addEventListener("contextmenu",function(e){
// 后台输出确保事件触发了
console.log("鼠标右键已经按下");
// 正常网页右键点击会有菜单
// 默认事件阻止后不会有菜单产生
e.preventDefault() ;
})
</script>
</body>
运行结果:
3.3 兼容性
3.3.1 标准浏览器
e.preventDefault() ;
3.3.2 低版本IE浏览器
e.returnValue = false;
四、阻止事件的传播/阻止冒泡事件
4.1 定义
父级标签 和 后代标签 添加了相同类型的事件,后代标签 触发事件 父级标签 也会触发 相同类型的事件,这样的执行原理 称为 事件的传播 / 冒泡事件。
4.2 阻止事件传播语法
标签对象.addEventListener(事件类型, function(e / event){
e.stopPropagation();
})
代码演示:
<body>
<div>
<h1></h1>
</div>
<script>
// 获取标签对象
const oDiv = document.querySelector("div");
const oH = oDiv.querySelector("h1");
// 给div添加点击事件
oDiv.addEventListener("click",function(){
console.log("你点击了一下div标签");
})
// 给h1添加点击事件
oH.addEventListener("click",function(e){
console.log("你点击了一下h1标签");
// 事件传播阻止
e.stopPropagation();
})
</script>
</body>
运行结果:
阻止前:点击h1 标签 ,div的点击事件也会触发.
阻止后:点击h1只会执行h1的事件。
4.3 兼容性
4.3.1 标准浏览器
e.stopPropagation();
4.3.2 低版本IE浏览器
e.cancelBubble = true ;
五、 常见的事件类型
5.1 window相关的事件类型
window.addEventListener( 'resize' , function(){} ) | 浏览器视窗窗口大小监听事件 |
window.addEventListener( 'scroll' , function(){} ) | 页面滚动监听事件 |
window.addEventListener( 'load' , function(){} ) | 浏览器加载事件 |
window.open(url地址) | 新窗口打开URL链接 |
window.open(URL地址) | 关闭当前窗口 |
document.addEventListener('visibilitychange') document.visibilityState 查询值为hidden/visible | 窗口最小化监听事件 |
前五个属性在我之前的博客都有详细解释,需要请查看往期博客,这里主要演示最后一种窗口最小化监听事件。
代码演示:
<body>
<script>
document.addEventListener("visibilitychange",function(){
console.log(document.visibilityState);
})
</script>
</body>
运行结果:
5.2 鼠标相关的事件类型
click | 鼠标左键单击 |
dblclick | 鼠标左键双击 |
contextmenu | 鼠标右键单击 |
mousedown | 鼠标按键按下 |
mouseup | 鼠标按键抬起 |
mouseover | 鼠标移入 |
mouseout | 鼠标移出 |
mouseenter | 鼠标移入 |
mouseleave | 鼠标移出 |
代码演示:
<body>
<div></div>
<script>
const oDiv = document.querySelector("div");
oDiv.addEventListener("click",function(){
console.log("鼠标左键单击");
})
oDiv.addEventListener("dblclick",function(){
console.log("鼠标左键双击");
})
oDiv.addEventListener("contextmenu",function(){
console.log("鼠标右键单击");
})
oDiv.addEventListener("mousedown",function(){
console.log("鼠标按键按下");
})
oDiv.addEventListener("mouseup",function(){
console.log("鼠标按键抬起");
})
</script>
</body>
运行结果:
注意:
mouseover 鼠标移入 mouseout 鼠标移出。经过标签对象边界时触发一次,给当前事件的后代标签也会触发事件。
mouseenter 鼠标移入 mouseleave 鼠标移出。经过标签对象边界时触发一次,给当前标签添加事件后代标签不会触发事件。
代码演示:
<body>
<div>
<h1></h1>
</div>
<script>
const oDiv = document.querySelector("div");
oDiv.addEventListener("mouseover",function(){
console.log("鼠标移入");
})
oDiv.addEventListener("mouseout",function(){
console.log("鼠标移出");
})
oDiv.addEventListener("mouseenter",function(){
console.log("鼠标移入(后代不会触发)");
})
oDiv.addEventListener("mouseleave",function(){
console.log("鼠标移出(后代不会触发)");
})
</script>
</body>
运行结果:
5.3 键盘的相关事件类型
5.3.1 事件类型
keydown | 键盘按键按下 |
keypress | 键盘按键按下 |
keyup | 键盘按键抬起 |
e.keyCode | 键盘按键编号 |
e.altKey e.ctrlKey e.shiftKey 都是 判断 有没有 按下按键 如果 按下 返回值是 true 如果 没有按下 返回值是 false |
注意:
keydown 和 keypress 的区别,所有的按键都会触发 keydown 事件 有些特殊按键不会触发 keypress 事件。例如 esc ctrl alt shift back等 都不会触发 keypress 事件
5.3.2 兼容性
低版本的火狐浏览器 使用
e.which 存储 按键编号
现在所有的浏览器都是用
e.keyCode 和 e.which 同时存储 按键编号
5.3.3 注意事项
1, 键盘事件 默认只有可以获取焦点的标签支持
一般 只是 input标签 和 textarea
以及 document document.documentElement document.body
2, div等无法获取焦点的标签 可以通过 事件的抛发 绑定 键盘事件
3, 键盘按下事件 如果一直按住键盘按钮 会 一直触发事件
代码演示:
<body>
<input type="text">
<script>
const oIpt = document.querySelector("input");
oIpt.addEventListener("keydown",function(){
console.log("键盘按下了(keydown)");
})
oIpt.addEventListener("keypress",function(){
console.log("键盘按下了(keypress) esc ctrl alt shift back 等 都不会触发 keypress 事件 ");
})
oIpt.addEventListener("keyup",function(){
console.log("键盘抬起了");
})
</script>
</body>
运行结果:
5.4 表单的相关事件类型
submit | 表单提交事件 绑定给form标签 点击提交按钮 触发提交事件时触发 提交事件 |
focus | 标签获取焦点 标签获取焦点时 触发事件 |
blur | 标签失去焦点 标签失去焦点时 触发事件 |
change | 标签失去焦点同时数据改变 标签失去焦点 并且数据改变时 触发事件 |
input | 输入数据 每次输出数据时都会触发事件 |
代码演示:
<body>
<form>
<input type="text">
<button>提交</button>
</form>
<script>
const oForm = document.querySelector("form");
const oIpt = document.querySelector("input");
oIpt.addEventListener("focus",function(){
// 标签获取焦点时 触发事件
console.log("获取焦点");
})
oIpt.addEventListener("blur",function(){
// 标签失去焦点时 触发事件
console.log("失去焦点");
})
oIpt.addEventListener("change",function(){
// 标签失去焦点同时数据改变
console.log("标签失去焦点 并且数据改变时 触发事件");
})
oIpt.addEventListener("input",function(){
// 每次输出数据时都会触发事件
console.log("您输入数据了");
})
</script>
</body>
运行结果:
5.5 移动端事件
touchstart | 触摸开始 |
touchend | 触摸结束 |
touchmove | 触摸移动 |
由于博主功力尚浅,暂不能详细解释此类事件,见谅!
5.6 特殊事件
transitionstart | 过渡开始 |
transitionend | 过渡结束 |
animationstart | 动画开始 |
animationend | 动画结束 |
由于博主功力尚浅,暂不能详细解释此类事件,见谅!
六、事件点击中的坐标
6.1 相对于 触发事件的标签对象 左上角的坐标
e.offsetX
e.offsetY
代码演示:
<script>
const oDiv = document.querySelector("div");
oDiv.addEventListener("click",function(e){
// 相对于 触发事件的标签对象 左上角的坐标
console.log(e.offsetX);
console.log(e.offsetY);
})
</script>
运行结果:
6.2 相对于 视窗窗口 左上角的坐标
e.clientX
e.clientY
代码演示:
<body>
<div></div>
<script>
const oDiv = document.querySelector("div");
oDiv.addEventListener("click",function(e){
// 相对于 视窗窗口
console.log(e.clientX);
console.log(e.clientY);
})
</script>
</body>
运行结果:
6.3 相对于 HTML页面 左上角的坐标
e.pageX
e.pageY
代码展示:
<body>
<div></div>
<script>
const oDiv = document.querySelector("div");
oDiv.addEventListener("click",function(e){
// 相对于 HTML页面 左上角的坐标
console.log(e.pageX);
console.log(e.pageY);
})
</script>
</body>
运行结果:
七、事件对象 event
7.1 定义
事件处理函数 中 参数 存储的数据数值是 触发事件的对象 相关数据信息
触发事件的对象 和 绑定事件的的 不一定是同一个对象
触发事件时 JavaScript程序 自动向 形参中 存储实参 也就是 向 事件对象 中 自动储存 触发事件的标
7.2 语法
事件源.addEventListener( 事件类型 , function( 事件对象 ){
事件对象.target
})
八、事件委托
8.1 定义
不是直接给标签对象绑定事件,给 父级标签 绑定事件 ,通过 事件对象.target 判断 触发事件的不同的标签对象,执行 不同的函数程序。
8.2 语法
对象对象.target 就是一个 DOM标签对象
对象对象.target.tagName 是 大写英文字符的标签名称
对象对象.target 执行 DOM 操作 判断 点击的是什么标签
8.3 优点
(1)只给一个标签事件添加对象,通过判断执行不同的程序,执行效率更高
(2)更加有利于 动态渲染生成的标签 添加事件
因此 动态渲染生成的标签 使用 事件委托 ,给一直存在的父级 添加 事件 ,通过 事件委托 判断 事件对象.target 是 什么标签 触发什么程序。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
footer{
width: 1000px;
height: 800px;
background-color: blue;
margin: auto;
}
div{
width: 800px;
height: 600px;
margin: auto;
background-color: blueviolet;
}
h1{
width: 600px;
height: 400px;
margin: auto;
background-color: red;
}
p{
width: 400px;
height: 200px;
margin: auto;
background-color: pink;
}
</style>
</head>
<body>
<footer>
<div>
<h1>
<p></p>
</h1>
</div>
</footer>
<script>
const oFooter = document.querySelector("footer");
oFooter.addEventListener("click",function(e){
// 通过事件委托判断点击的标签对象,执行对应的程序
if(e.target.tagName === "FOOTER"){
console.log("您点击的是footer");
}else if(e.target.tagName === "DIV"){
console.log("您点击的是div");
}else if(e.target.tagName === "H1"){
console.log("您点击的是h1");
}else if(e.target.tagName === "P"){
console.log("您点击的是p");
}
})
</script>
</body>
</html>
运行结果: