精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
先来介绍一下我们的示例文档,这个文档最终将成为一个简单的影集。影集中会显示一组照片,单击链接则会显示更多照片。当用户把光标移动到每一张照片上面时,会显示该照片的文本简介,这个功能是使用JQuery的事件系统实现的。
<div id="container"> <h1>photo Gallery</h1> <div id="gallery"> <div class="photo"> <img src="photo/skyemonroe. jpg"> <div class="details"> <div class="description">The Cuillin Mountains, Isle of Skye,Scotland. </div> <div class="date">12/24/2000</div> <div class="photographer">Alasdair Dougall</div> </div> </div> <div class="photo"> <img src="photos/dscn1328. jpg"> <div class="details"> <div class="description">Mt. Ruapehu in summer</div> <div class="date">01/13/2005</div> <div class="photographer">Andrew McMillan</div> </div> </div> <div class="photo"> <img src="photos/024.JPG"> <div class="details"> <div class="description">midday sun</div> <div class="date">04/26/2011</div> <div class="photographer">Jaycee Barratt</div> </div> </div> <!--//此处省略了部分代码--> </div> <a id="more-photos" href="pages/1. html">More Photos</a> </div>
在为文档中的照片应用样式,将它们一行三个地排列整齐之后,这个影集的外观就如图所示。
好了,现在我们想来实现一个常见的任务,那就是让浏览器响应对某个页面元素的单击。在单击More Photos链接时,需要执行一次AJAX请求,加载下一组照片并将它们追加到<div id="gallery">。此外,还要更新More Photos链接的目标,让它指向包含下一组照片的页面。
$(document). ready(function(){ var pageNum=1; $('#more-photos'). click(function(){ var $link=$(this); var url=$link.attr('href'); if(url){ $. get(url,function(data){ $('#gallery'). append(data); }); pageNum++; if(pageNum<20){ $link. attr('href','pages/'+pageNum+'. html'); } else{ $link. remove(); } } return false; }); });
在. click()处理程序中,我们使用变量pageNum来跟踪要请求的下一个照片页面,使用这个数字来为链接构建新的href属性。因为pageNum是在函数外部定义的,因此它的值可以在两次点击的过程中得以保持。在到达最后一页时,就删除这个链接。
接下来,实现在用户鼠标移动到照片上的时候,显示照片的详细信息。首先,为了显示这些信息,可以使用. hover()方法。
$(document). ready(function(){ $('div. photo'). hover(function(){ $(this). find('. details'). fadeTo('fast'0.7); },function(){ $(this). find('. details'). fadeOut('fast'); }); });
这样,当用户鼠标进入照片区域时,相关信息就会以70%的不透明度淡入显示出来;而当用户鼠标离开照片时,相关信息则立即淡出。
当然,实现这个任务的方式有很多。由于两个处理程序中有一部分代码完全相同,因此可以把它们组合起来以减少冗余的代码。比如,可以为mouseenter和mouseleave绑定同一个处理程序,只在两个事件名称之间加一个空格即可。
$(document). ready(function(){ $('div. photo') .bind('mouseenter mouseleave',function(event){ var $details=$(this). find('. details'); if(event. type=='mouseenter'){ $details. fadeTo('fast',0.7); }else{ $details. fadeOut('fast'); } }); });
在同一个处理程序绑定到两个事件的情况下,通过检测事件的类型就可以确定应该是淡入还是应该淡出。而查找<div>的代码对两个事件来说则是相同的,所以这里可以只写一次。
毫无疑问,这个例子经过了精心设计,所以共享的代码才会那么少。不过,在其他情况下,这种技术是可以显著减少代码复杂性的。比如,假设我们在mouseenter事件发生时添加一个类,在mouseleave事件发生时删除它,而不是动态改变不透明度,那么只要像下面这样在处理程序中添加一行代码即可:
$(this). find('. details') . toggleClass('entered',event. type=='mouseenter');
无论如何,我们脚本现在已经按照预期运行了——但有一个例外,那就是当用户单击More Photo链接加载了更多照片时,新加载的照片不会响应那两个事件。