事件流
事件流描述的是从页面中接收事件的顺序。
DOM事件流
- 事件捕捉阶段
- 处于目标阶段
- 事件冒泡阶段
事件捕获过程中,document对象首先接收到click事件,然后事件沿着DOM树依次向下,一致传播到事件的实际目标,就是id为btn的a标签。接着所在事件冒泡过程中,事件开始时由最具体的元素(a标签)接收, 然后逐级向上传播到较为不具体的节点(document)。
在jquery中是没有捕获阶段的,在实际项目中用不到捕获阶段。
事件冒泡的处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
<style>
.father{
width:300px;
height:300px;
background-color:red;
}
</style>
</head>
<body>
<div class="father">
<button>按钮</button>
</div>
<script>
$(function(){
// 按钮绑定事件,在所有的事件回调函数中,都会有默认的事件对象event
$('button').click(function(event){
console.log(event);
alert($(this).text());
// 阻止事件冒泡,事件就不会王父亲上传播了
event.stopPropagation();
})
// 给父亲盒子绑定事件
$('.father').click(function(){
alert('父亲被点击了');
// 既阻止了默认事件,又阻止了冒泡
return false;
})
/*没有阻止事件冒泡,当点击button按钮的时候,button事件触发,父盒子的事件也触发。这就是事件冒泡,点击button的事件,冒泡到.father,其事件也被执行。*/
});
</script>
</body>
</html>
事件对象
默认参数event的一些属性解析。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<input type="text" name="user">
<p class="content"></p>
<script>
$(function(){
//$('input').click(function(e){
//
//})
// jquery中没有监听输入框输入内容的方法
// 使用原生js的 oninput事件
$('input').get(0).oninput = function(e){
console.log(e.target.value);
$('.content').text(e.target.value);
}
$('button').click(function(e){
// currentTarget 当前事件的目标对象
//console.log(e.currentTarget);
// 事件的触发对象 返回js对象
console.log(e.target);
// 在用事件的时候 95%都需要阻止冒泡
//e.stopPropagation();
console.log(e.target.innerText);
console.log($(e.target).text());
// 判断 e.currentTarget e.target this之间的关系
console.log(e.target === this);
console.log(e.currentTarget === this);
})
$('body').click(function(e){
//console.log(e.currentTarget);
console.log(e.target);
console.log(e.target === this);
console.log(e.currentTarget === this);
})
$('html').click(function(e){
//console.log(e.currentTarget);
console.log(e.target);
console.log(e.target === this);
console.log(e.currentTarget === this);
})
})
</script>
</body>
</html>
效果:
点双击点击事件
click()绑定单击事件,dblclick()绑定双击事件,会有单双击点击事件冲突,即双击的时候单击事件也会触发。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<script>
$(function(){
// 遇到的问题是,在双击时,调用了两次单击。
// 两次单击中间的时间差是300ms,如果小于300ms表示双击。
$('button').click(function(e){
console.log('点击了');
})
$('button').dblclick(function(e){
console.log('双击击了');
})
})
</script>
</body>
</html>
效果
解决双击冲突
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<script>
$(function(){
// 解决单双及冲突问题
var timer;
$('button').click(function(e){
// 如果是双击事件,要阻止两次单击事件的调用
clearTimeout(timer); // 取消第一次延迟未执行的定时器
timer = setTimeout(function(){
console.log('点击了');
}, 300);
})
$('button').dblclick(function(e){
clearTimeout(timer); // 取消的是第二次延迟为执行的定时器
console.log('双击击了');
})
// 双击的时候,给单击设置定时器让其然后执行,在双击的事件驱动中将timer清除,点击事件就不会调用了。
})
</script>
</body>
</html>
效果:
鼠标移入移出事件
mouseover, mouseout
鼠标指针穿过/离开被选元素或者当前元素的子元素会触发事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
<style>
.father{
width:200px;
height:200px;
background-color:red;
}
.child{
width:50px;
height:50px;
background-color:green;
}
</style>
</head>
<body>
<div class="father">
<div class="child"></div>
</div>
<script>
$(function(){
// 鼠标穿过被选元素和被选元素的子元素,会触发此事件
$('.father').mouseover(function(e){
console.log('移入');
})
$('.father').mouseout(function(e){
console.log('移出');
})
})
</script>
</body>
</html>
mouseenter, mouseleave
鼠标只穿过被选元素会触发事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
<style>
.father{
width:200px;
height:200px;
background-color:red;
}
.child{
width:50px;
height:50px;
background-color:green;
}
</style>
</head>
<body>
<div class="father">
<div class="child"></div>
</div>
<script>
$(function(){
$('.father').mouseenter(function(e){
console.log('移入');
})
$('.father').mouseleave(function(e){
console.log('移出');
})
})
</script>
</body>
</html>
jquery的合成事件,合成了mouseenter mouseleave
$('.shortCart').hover(function(){进入事件mouseenter},function(){出去事件mouseleave});
表单事件
1. change() 表单元素发生改变时触发事件,此事件仅限于 input textarea select 元素。
2. select() 文本元素发生改变时触发事件,此事件仅限于input type值为text和textarea的元素
3. submit() 表单元素有默认的submit事件,但是可以调用jQuery的submit通过event.preventDefault来阻止默认事件,动态发送数据。
select
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
$(function(){
//文本选中的时候会调用
$('input[type="text"]').select(function(){
console.log("内容选中了");
})
})
</script>
</body>
</html>
效果
submit
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<form action="//www.baidu.com/s">
<input type="text" name="wd">
<input type="submit" value="搜索">
</form>
<script>
$(function(){
$('form').submit(function(e){
// 阻止form的submit默认事件
e.preventDefault();
console.log('被提交了');
})
})
</script>
</body>
</html>
鼠标聚焦失焦事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
$(function(){
// 页面一刷新的时候就获取焦点
$('input[type="text"]').focus();
setTimeout(function(){
// 两秒钟后失去焦点
$('input[type="text"]').blur();
}, 2000);
// 获取焦点的时候绑定事件
$('input[type="text"]').focus(function(){
console.log('获取焦点');
});
$('input[type="text"]').blur(function(){
console.log('失去焦点');
});
})
</script>
</body>
</html>
键盘按键事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
$(function(){
$('input[type="text"]').keyup(function(){
console.log('键盘弹起');
});
$('input[type="text"]').keydown(function(){
console.log('键盘按下');
});
})
</script>
</body>
</html>
事件委托
事件委托就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来完成这个事件。
原理:利用冒泡原理,把事件加到父级上,触发执行效果。
作用:
- 性能要好
- 针对新创建的元素,可以直接拥有事件
使用场景:
- 为DOM中很多元素绑定同一事件
- 为DOM中不存在的元素绑定事件
没有事件委托的场景,新添加的li标签无事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
</ul>
<button>添加</button>
<script>
$(function(){
// 未来动态的往ul中追加了li标签,就没有事件了,需重新添加事件
$('ul>li').click(function(){
alert($(this).text());
})
$('button').click(function(){
$('ul').append('<li>3</li>');
})
})
</script>
</body>
</html>
增加事件委托:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.6.0.js"></script>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
</ul>
<button>添加</button>
<script>
$(function(){
// 事件委托 on(事件类型,选择器,事件绑定)
$('ul').on('click', 'li', function(e){
alert($(this).text());
})
$('button').click(function(){
$('ul').append('<li>3</li>');
})
})
</script>
</body>
</html>
效果: