jQuery的高级事件处理
jQuery的事件委托
操作案例
建立一个简单的影集,影集中会显示一组照片,点击添加连接会有更多的图片
当用户把光标移动到每一张照片时,会显示对应的文字
相关html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="jquery-3.4.1.js"></script>
<style>
#container{
margin: 0 auto;
width: 1000px;
background-color: #ccc;
}
#gallery>.photo>img{
height: 160px;
width: 158px;
}
#gallery{
width: 800px;
margin:0 auto;
height: 1200px;
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
align-content: space-around;
}
#gallery>.photo{
border: 9px solid #fff;
border-radius: 12px;
height: 160px;
width: 158px;
position: relative;
}
#gallery>.photo>.details{
position: absolute;
top:0;
left:0;
opacity: 0 ;
}
</style>
</head>
<body>
<div id="container">
<h1>Photo Gallery</h1>
<div id="gallery">
<div class="photo">
<img src="/img/phone3.jpg" alt="">
<div class="details">
<div class="description">
amet consectetur
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
modi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone4.jpg" alt="">
<div class="details">
<div class="description">
Lorem ipsum
</div>
<div class="date">
recusandae dicta,
</div>
<div class="photographer">
elit. Hic ut velit
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone.jpeg" alt="">
<div class="details">
<div class="description">sectetur adipisicing
</div>
<div class="date">
aperiam voluptate
</div>
<div class="photographer">
dolore nisi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/flower.jpg" alt="">
<div class="details">
<div class="description">
dolor, sit
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
olore nisi
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone3.jpg" alt="">
<div class="details">
<div class="description">
amet consectetur
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
modi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone4.jpg" alt="">
<div class="details">
<div class="description">
Lorem ipsum
</div>
<div class="date">
recusandae dicta,
</div>
<div class="photographer">
elit. Hic ut velit
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone.jpeg" alt="">
<div class="details">
<div class="description">sectetur adipisicing
</div>
<div class="date">
aperiam voluptate
</div>
<div class="photographer">
dolore nisi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/flower.jpg" alt="">
<div class="details">
<div class="description">
dolor, sit
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
olore nisi
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone3.jpg" alt="">
<div class="details">
<div class="description">
amet consectetur
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
modi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone4.jpg" alt="">
<div class="details">
<div class="description">
Lorem ipsum
</div>
<div class="date">
recusandae dicta,
</div>
<div class="photographer">
elit. Hic ut velit
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone.jpeg" alt="">
<div class="details">
<div class="description">sectetur adipisicing
</div>
<div class="date">
aperiam voluptate
</div>
<div class="photographer">
dolore nisi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/flower.jpg" alt="">
<div class="details">
<div class="description">
dolor, sit
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
olore nisi
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone3.jpg" alt="">
<div class="details">
<div class="description">
amet consectetur
</div>
<div class="date">
voluptatem culpa
</div>
<div class="photographer">
modi molestias
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone4.jpg" alt="">
<div class="details">
<div class="description">
Lorem ipsum
</div>
<div class="date">
recusandae dicta,
</div>
<div class="photographer">
elit. Hic ut velit
</div>
</div>
</div>
<div class="photo">
<img src="/img/phone.jpeg" alt="">
<div class="details">
<div class="description">sectetur adipisicing
</div>
<div class="date">
aperiam voluptate
</div>
<div class="photographer">
dolore nisi molestias
</div>
</div>
</div>
</div>
<a id="more-photos" href="pages/1.html">More Photos</a>
</div>
</body>
</html>
对应的js代码: 追加数据页面
$(document).ready(function(){
var pageNum=1;
$('#more-photos').click(function(event){
event.preventDefault();
var $link=$(this);
var url=$link.attr('href');
if(url){
$.get(url,function(data){
$('#gallery').append(data);
});
pageNum++;
if(pageNum<=3){
$link.attr('href','pages/'+pageNum+'.html');
}else{
$link.remove();
}
}
});
}
悬停时显示数据:
1 $('div.photo').on('mouseenter mouseleave',function(event){ 2 var $details=$(this).find('.details'); 3 if(event.type=='mouseenter'){ 4 $details.fadeTo('fast',0.7); 5 }else{ 6 $details.fadeOut('fast'); 7 } 8 });
实现效果

出现上述问题的原因:事件处理程序只会添加到调用on()方法时已经存在的元素上。
解决以上问题的方法:事件委托
jQuery的委托方法:
在把div.photo作为第二个参数的情况下,.on方法会把this关键字映射为#gallery中与该选择符匹配的元素
$('#gallery').on('mouseenter mouseout','div.photo',function(event){
var $details=$(this).find('.details');
if(event.type=='mouseenter'){
$details.fadeTo('fast',0.7);
}else{
$details.fadeOut('fast');
}
})
选择委托的作用域:
照片元素的任何祖先元素都可以作为委托的作用域
$(document).on('mouseenter mouseleave','div.photo',
function(event){
var $details=$(this).find('.details');
if(event.type=='mouseenter'){
$details.fadeTo('fast',0.7);
}else{
$details.fadeOut('fast');
}
});
早委托:
我们选择docoment作为委托作用域,document元素是随着页面加载
几乎立即就可以调用的,绑定在document处理程序如果放在$(document).ready()中
就要等待整个DOM构建完成才能执行绑定,使用立即被调用的函数表达式可以在整
个文档未就绪的情况下,确保所有的div.photo元素只要呈现在页面上就可以应用上
mouseover和mouseleave行为。
(function($){
$(document).on('mouseenter mouseleave','div.photo',
function(event){
var $details=$(this).find('.details');
if(event.type=='mouseenter'){
$details.fadeTo('fast',0.7);
}else{
$details.fadeOut('fast');
}
}
)
})(jQuery);
早委托的好处:
假设一个click事件绑定在一个链接上,这个事件处理程序要执行
某些操作,同时要阻止链接的默认行为。如果等文档就绪之后,再绑定它,那很可能
在绑定处理程序之前用户已经点击该链接离开了当前页面。

浙公网安备 33010602011771号