三、(3)jQuery事件和动画
jQuery事件和动画
jQuery中的事件
文档和窗口加载事件
1、DOM加载完毕后执行的事件
js:
作用: 为了让js找到DOM,一般让DOM加载完成后,再加载js (加载完成的元素有: HTMLDOM,图片,视频,音频....第三方资源加载完成后,才执行js) 。
语法:
window.onload=function(){ //执行的js代码 }
jquery:
作用: 保证HTMLdom加载完成后,才执行js代码
语法:
//方式一: $(document).ready(function{ //执行js代码 }); //方式二:(推荐) $(function(){ //执行js代码 }) //方式三: jQuery(function(){ //执行js代码 })
注意:
- 1. window.onload 在同一个网页中只执行一次, $(function(){}),可以在同一个页面中出现多次
- 2. window.onload 必需在网页中所有资源加载完成后,才执行js代码, $(function(){}) 只要所有的HTMLDOM加载完成即可,执行js代码
案例1:(js)
<script> // window.onload=function () { // console.log(box); // } //一个事件只能绑定一个事件处理函数 // window.onload=function () { // alert(111); // } // window.onload=function () { // alert(22); // } //解决方案:使用事件监听函数来注册事件 window.addEventListener("load",function () { alert(111); }); window.addEventListener("load",function () { alert(222); }); </script> </head> <body> <div id="box">盒子</div> </body>
案例2:(jquery)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery.js"></script> </head> <body> <div id="box">盒子</div> <script> //获取盒子 //console.log($("#box")[0]); //方式一: $(function () { console.log($("#box")[0]); }); //方式二: $(document).ready(function () { console.log($("#box")[0]); }); </script> </body> </html>
事件绑定bind()方法
事件四要素:
- 事件源: 事件发生在谁身上,谁就是事件源
- 事件类型: 事件发生时,发生的时哪类事件
- 事件处理函数(事件句柄); 事件发生时,执行的js的代码
- 事件对象: 是一个对象(旁观者),包括事件发生时的所有信息
1. 事件注册 bind() 和 on() 效果相同:
bind()和on()不同: bind()和on() 一个参数之差----面试题(扩展)
jq对象.bind('事件类型',function(){});===> jq对象.on('事件类型',function(){});
jq对象.on('事件类型','委派的子元素',function(){});
2.事件注册的分类:
- 1. 一对一 : 一个事件源绑定一个事件处理函数
- 2. 一对多 : 一个事件源绑定多个事件处理函数
- 3. 多对一 : 多个事件,绑定到一个事件处理函数上
- 4. 多对多 : 多个事件,绑定到多个事件处理函数上
(1)一对一 : 一个事件源绑定一个事件处理函数
语法: jq对象.on('事件类型',事件处理函数);
jq对象.on('click',function(){ //执行的jq代码 });
<div id="box">这是盒子</div> <script> //一对一:一个事件源绑定一个事件处理函数 //on $("#box").on("mouseover",function () { $(this).css("background","#00f"); }); //bind $("#box").bind("mouseover",function () { $(this).css("background","#0f0"); }); </script>
(2) 一对多: 一个事件源绑定多个事件处理函数(重点)
语法: jq对象.on('事件类型',事件处理函数).on('事件类型',事件处理函数).....;
jq对象.on('click',function(){ //执行的jq代码 }).on('mouseover',function(){ //执行的jq代码 });
<div id="box">这是盒子</div> <script> //2. 一对多 : 一个事件源绑定多个事件处理函数 $("#box").on("mouseover",function () { $(this).css("background","#00f"); }).on("mouseout",function () { $(this).css("background","red"); }) </script>
(3)多对一 : 多个事件,绑定到一个事件处理函数上
语法: jq对象.on('事件类型1 事件类型2 ..... ',function(){//执行的jq代码});
jq对象.on('click mouseover mouseout',function(){ //执行的jq代码 })
<div id="box">这是盒子</div> <script> // 3. 多对一 : 多个事件,绑定到一个事件处理函数上 $("#box").on("mouseout click",function () { $(this).css("background","#00f"); }); </script>
(4)多对多 : 多个事件,绑定到多个事件处理函数上
语法:
jq对象.on({
'事件类型1':事件处理函数1,
'事件类型2':事件处理函数2,
'事件类型3':事件处理函数3
});
jq对象.on({ 'click':function(){}, 'mouseover':function(){}, 'dblclick':function(){} });
<div id="box">这是盒子</div> <script> // 4. 多对多 : 多个事件,绑定到多个事件处理函数上 $("#box").on({ "click":function () { alert(111); }, "mouseover":function () { alert(222); }, "mouseout":function () { alert(333); } }); </script>
事件委派
1. 解决的问题:
- 1)在事件注册中,后来添加进行的元素也绑定上相关事件。没有上绑上的原因: 是由于绑定的元素在绑定事件时,还没有产生,所以绑定不上
- 2)提升js注册事件的性能(防止重复绑定)
2. 事件委派: 表示把事件委派给父级,让父级给到子元素
语法: jq对象的父级.on('事件类型','新加的子元素',事件处理函数);
<body> <div id="box"> <p>段落1</p> </div> <button id="btn">添加</button> <script> //事件委派 $("#box").on("click","p",function () { alert(111); }); /*点击btn添加一个新的标签,不能绑定事件, 主要是由于p标签在绑定事件时没有产生,必须使用事件委派 */ //添加新的一个p标签 $("#btn").on("click",function () { $("<p>新加入的标签</p>").appendTo("#box"); }); </script> </body>
事件移除unbind()方法
注意:
- 1. 如果使用bind()注册的事件,需要使用unbind()来移除事件
- 2. 如果使用on()注册的事件,需要使用off()来移除事件
语法:(on)
$(‘选择器’).off() //移除对象上所有的事件
$(‘选择器’).off('事件类型') //移除对象上指定事件类型的事件
$(‘选择器’).off('事件类型',事件处理函数) //移除对象上指定类型的处理函数
注意: unbind()语法同上
1. 所有事件取消绑定
$(‘选择器’).unbind()
2. 取消指定的事件类型绑定
$(‘选择器’).unbind(‘click’);
3. 取消指定的事件类型对应的函数绑定
var foo = function () {
// 处理某个事件的代码
};
<div id="box">这是盒子</div> <script> //事件绑定 $("#box").on("mouseover",function () { $(this).css("background","#00f"); }).on("mouseout",function () { $(this).css("background","red"); }).on("click",a); function a() { alert(111); } //移出事件 //$("#box").off();//移出所有事件 // $("#box").off("mouseover");//移出指定事件 //注意: 长像相同的两个匿名函数,并不是同一个函数 抽取成公用函数 $("#box").off("click",a);//移出指定事件对应的函数 </script>
合成事件hover()方法
1. hover()方法
hover()方法相当于mouseenter与mouseleave事件的组合,用于模拟鼠标指针悬停事件。
<div id="box">这是盒子</div> <script> //hover():相当于mouseenter与mouseleave的组合,一个方法有两个效果 //事件绑定 $("#box").hover(function () { alert(111); },function () { alert(222); }) </script>
2. toggle()方法 用于模拟鼠标连续click事件
//toggle方法在1.9版本时就已经删除了,不建议再使用。如果要使用,可以换jquery版本。
$("body").toggle(
function () { }, //第一次点击触发
function () { }, //第二次点击触发
function () { } //第三次点击触发
);
同时toggle()方法还有一个作用:切换元素可见状态
$('input').toggle( function () { $('ul').toggle(); //是显示的则隐藏,是隐藏的则显示 }, function () { $('ul').toggle(); //是显示的则隐藏,是隐藏的则显示 } );
事件委派delegate()方法
语法:
$("外部已存在元素"). delegate(‘新增元素选择’,事件类型 ,事件处理函数);
例如:
$("table").delegate("tr a","click",function(){})
在新增的元素table的tr中的a标签上添加事件
table 是已存在的元素
tr a 是以table为父元素的选择器,但是tr可以是新添加的元素.
trigger()和triggerHandler()方法
.trigger('事件类型') 有浏览器默认行为--重点
.triggerHandler() 只会执行具体事件,没有浏览器默认动作--了解
语法:
先前触发事件执行:$(“form”).submit();
现在触发事件执行:$(“form”).trigger(‘submit’);
或 $(“form”).triggerHandler(‘submit’);(没有浏览器默认动作)
triggerHandler() 只会执行具体事件,没有浏览器默认动作
<body> <form action="" id="box"> <p>账号:<input type="text" name="user" value="张三"/></p> <p>密码:<input type="password" name="pad" value="123123"/></p> <input type="submit" value="提交"/> </form> <script> //手动提交 $("#box").on("submit",function () { alert("提交成功!"); }); //自动提交 三秒后自动提交,定时器 setInterval(function () { $("#box").trigger("submit");//自动提交 //只产生行为,不提交 // $("#box").triggerHandler("submit"); },3000); </script> </body>
事件对象Event及常用属性
概念: 事件发生,事件对象作为一个参数传处理函数中(相当于占位 event e ),事件对象包含了事件发生时所有相关信息(后期用于获取相关参数如: 事件源,事件类型,事件处理函数....)。
语法:
$("选择器").on('事件类型',function(event/e){ //获取事件对象: //event / e; });
常见属性:
- event.type:获取事件的类型
- event.target:获取触发事件的元素
- event.pageX 和 event.pageY:获取鼠标当前相对于页面的坐标
- event.preventDefault() 方法:阻止默认行为
- event.which:获取在鼠标单击时,单击的是鼠标的哪个键
示例:
<body> <div id="box"></div> <script> $("#box").on("click",function (event) { console.log(event.type);//事件类型 console.log(event.target);//事件源 console.log(event.pageX);//获取鼠标x坐标 console.log(event.pageY);//获取鼠标y的坐标 }); $("body").on("keydown",function (e) { console.log(e.which);//获取按键的值 }) </script>
阻止浏览器默认行为preventDefault()
浏览器默认动作:
- 点击表单提交按钮: 默认提交表单
- 点击超链接: 默认打开页面链接
利用提交事件可以实现表单域验证,当验证失败时阻止提交表单.
在超链接a标签上添加事件,仅仅让事件生效从而阻止打开链接.
e.preventDefault(); //相当于是一个 return false
事件冒泡stopPropagation()方法
所有触发的事件现在会冒泡到DOM树上了. 举例来说,如果你在一个段落p上触发一个事件,他首先会在这个元素上触发,其次到父元素,在到父元素的父元素,直到触发到document对象。阻止冒泡e.stopPropagation();
<body> <div id="box1"> 盒子1 <div id="box2"> 盒子2 <div id="box3"> 盒子3 </div> </div> </div> <script> $("#box1").on("click",function (e) { alert("盒子1"); e.stopPropagation(); }); $("#box2").on("click",function (e) { alert("盒子2"); e.stopPropagation(); }); $("#box3").on("click",function (e) { alert("盒子3"); e.stopPropagation(); }); </script>
事件应用实例
表单事件应用
1. 表单有2个基本组成部分
- 表单域:包含处理表单数据所用的服务器端程序URL以及数据提交到服务器端的方法。
- 表单元素:包含文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框、和文件上传框等。
- 表单按钮:包括提交按钮、复位按钮和一般按钮,用于将数据传送到服务器上或者取消传送,还可以用来控制其他定义了处理脚本的处理工作。
2. 单行文本框应用
文本框是表单域中最基本的元素,基于文本框的应用有很多。设置添加和失去焦点事件:
$(funciton(){ $(":input").focus(function(){//获取焦点 $(this).addClass("focus"); }).blur(function(){//失去焦点 $(this).removeClass("focus"); }); });
3. 复选框应用
1)当使用全选功能时可以使用prop()方法设置属性checked的值使复选框选中:
$("#checkedAll").click(function(){ $("[name=items]:checkbox").prop("checked",true); });
如果是不选操作设置为false就可以了。
2)反选操作稍微复杂一些,可以使用非运算符!
$("#checkedRev").click(fucntion(){ $('[name=items]:checkbox').each(function(){ $(this).attr("checked",$!(this).prop("checked")); }); });
表格样式应用
1、表格奇数行和偶数行变色效果
$("tr :odd").addClass("odd");//给奇数行添加样式 $("tr:even").addClass("even");//给偶数行添加样式
odd和even选择器索引是从0开始的所以第1行是偶数。
以上代码将表头也算进去,因此需要排除表格头部<thead>中的<tr>
$("tbody>tr:odd").addClass("odd");
如果还需要将某一行变为高亮显示状态,那么可以是哦你contains选择器来实现。
例如:“123”这行,代码如下:
$("tr:contains('123')").addClass("selected");
2、为表格内单击行进行操作
$('tbody>tr').click(funcition(){ $(this).addClass('selected') .siblings().removeClass('selected'); .find(':radio').prop('checked',true); });
jQuery中的动画方法
基本动画函数show()和hide()
概念: 在jq中,已经定义好的动画效果,不需再次定义,直接即可。
分类:
- show() 和 hide() 显示/隐藏
- toggle(): 表示相到换切效果
- fadeIn() fadeOut() 淡入/淡出
- slideUp() slideDown() 滑上 /滑下
Show()显示隐藏匹配元素。
例如:显示所有段落,$("p").show()
show(speed,[callback])
例如:用缓慢的动画将隐藏的段落显示出来,历时600毫秒,$("p").show(600);
hide() 隐藏显示元素。
例如:隐藏所有段落,$("p").hide()
hide(speed,[callback])
例如:用600ms的时间将段落缓慢的隐藏,$("p").hide("slow");
toggle
切换元素的可见状态。如果元素时可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。
例如:切换所有段落的可见状态,$("p").toggle();
toggle(switch)
例如:切换所有段落的可见状态,varflip=0;$("button").click(function(){$("p").toggle(flip++%2==0);});
toggle(speed,[callback])
例如:用200ms将段落迅速切换显示状态,之后弹出一个对话框,$("p").toggle("fast",function(){alert("hello!");});
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery.js"></script> <style> #box{width: 200px;height: 200px;background: red;} </style> </head> <body> <button id="btn1">隐藏</button> <button id="btn2">显示</button> <button id="btn3">显示/隐藏</button> <div id="box"></div> <script> //隐藏 $("#btn1").on("click",function () { // $("#box").hide(); // $("#box").slideUp("slow"); $("#box").fadeOut(300); }); //显示 $("#btn2").on("click",function () { // $("#box").show(); // $("#box").show("fast"); // $("#box").slideDown(300); $("#box").fadeIn(300); }); //显示和隐藏 $("#btn3").on("click",function () { $("#box").toggle(); }); </script> </body> </html>
淡入淡出函数fadeIn()、fadeOut()、fadeTo()
fadeIn(speed,[callback])
通过透明度的变化来实现所有匹配元素的淡入效果,并在动画完成后可选的调用一个回调函数。这个动画只调整元素的不透明度,也就是说所有匹配的元素的高度和宽度不会发生变化。
例如:用600ms缓慢的将段落淡入,$("p").fadeIn("slow");
fadeOut(speed,[callback])
通过不透明度的变化来实现所有匹配元素的淡出效果,并在动画完成后可选择的触发一个回调函数。
例如:用600ms缓慢的将段落淡出,$("p").fadeOut("slow");
fadeTo(speed,opacity,[callback])
把所有匹配元素的不透明度以渐进方式调整到指定的不透明度,并在动画完成后可选的出发一个回调函数。
例如:用600ms缓慢将段落的透明度调整到0.66,大约2/3的可见度,$("p").fadeTo("slow",0.66)
滑动动画函数slideUp()和slideDown()
slideUp(speed,[callback])
通过高度变化(向上减小)来动态的隐藏所有匹配的元素,在隐藏完成后可选的触发一个回调函数。
例如:600ms缓慢的将段落滑上,$("p").slideUp("slow");
slideDown(speed,[callback])
通过高度变化(向下增大)来动态的显示所有匹配的元素,在显示完成后可选择的触发一个回调函数。这个动画效果只调整元素的高度,可以是匹配的元素以“滑动”的方式显示出来。
例如:用600ms缓慢的将段落滑下,$("p").slideDown("slow");
slideToggle(speed,[callback])
通过高度变化来切换所有匹配元素的可见性,并在切换完成后可选的触发一个回调函数。
例如:600ms缓慢的将段落滑上或滑下,$("p").slideTogggle("slow");
自定义动画animate()
作用:当上面的方法实现的动画无法满足我们时,可以使用animate()来自定义动画。
animate(params,[duration],[easing],[callback])用于创建自定义动画的函数。这个函数的关键在于制定动画形式及结果样式属性对象。这个对象中每个属性都表示一个可以变化的样式属性(如height、top或opacity)。
注意:所有指定的属性必须用骆驼形式,比如用marginLeft代替margin-left。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery.js"></script> <style> #box{width:200px;height:100px;background: red;} </style> </head> <body> <button id="mstart">开始运动</button> <button id="mstop">停止运动</button> <div id="box"></div> <script> /*需求:点击开始让盒子变长*/ $("#mstart").on("click",function () { //让盒子动起来 //1000表示毫秒。后面可以不需要 // $("#box").animate({"width":"1000px"},1000,"swing",function () { // alert("执行完毕!"); // }); // }); $("#box").animate({"width": "1000px"}, 1000).animate({"height":"500px"},1000); }); //停止动画 $("#mstop").on("click",function () { // $("#box").stop();//只停止当前动画,继续执行后面的动画 // $("#box").stop(true,false);//只停止当前动画,停止后面的动画 // $("#box").stop(true,true);//停止当前动画,并直接跳到当前动画的最后位置 }); </script> </body> </html>
动画缓动效果easing
jQuery效果函数(slideUp()、fadeIn()等)和animation()函数都接收另一个用来控制动画过程的速度的参数,这就是缓动(easing),它确定了动画过程不同时刻的速度。
方法:swing和linear。
Linear:
提供了一个稳定的动画,以使得动画的每个步骤都是相同的(例如,如果要让一个元素以逐渐变化的方式穿过屏幕,每一步的距离和前一步都是相同的)。
Swing:
要更加动态一些,随着动画的开始变得更加快一些,然后再慢下来。swing是一个常用设置,因此,如果没有指定任何缓动,jQuery会使用swing方法。
停止动画和判断是否处于动画状态
stop([clearQueue],[gotoEnd])
- .stop() // 停止当前动画
- .stop(true) // 停止所有动画
- .stop(true,true) // 停止所有动画,到达动画终点
is(":animated"). 判断元素是否处于动画状态,可用于防止动画累积。
例:
<script> if(!$("selector").is(":animated")){ //判断元素是否正处于动画状态 //如果当前没有进行动画,则添加新动画 } </script>
延迟执行动画delay()
delay() 延迟执行动画
当一个动画stop()了之后还能够用delay()来延迟执行。从停止位置继续执行。当然用原来的方法继续执行也不可,不过没有延时效果。
delay(duration,[queueName]) 设置一个延迟值来执行动画 Integer,String
$("#div1").delay(3000).hide(3000); //表示在3000毫秒后执行hide(3000);
其他动画方法
- toggle()显示与隐藏
- slideToggle()改变高度的显示与隐藏。
- fadeTo(time,op)通过指定时间将元素的不透明度变为o
- fadeToggle()改变不透明度的显示与隐藏。
动画案例:Tab滑动菜单
效果图:
代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery.js"></script> <style> *{margin: 0 auto;padding: 0;} #tab{ width: 300px; height: 400px; background: #cccccc; } #tab ul{list-style: none;height: 50px;} #tab ul li{ width: 100px; line-height: 50px; text-align: center; float: left; } .a{background: red;color: #ffffff;} .content p{ width: 300px; height: 350px; background: #00aa00; display: none; } .content p.on{ display: block; } </style> </head> <body> <div id="tab"> <ul> <li class="a">企业文化</li> <li>团队介绍</li> <li>大事记</li> </ul> <div class="content"> <p class="on">内容1</p> <p>内容2</p> <p>内容3</p> </div> </div> <script> $("#tab ul li").on("mouseover",function () { //鼠标移动到上面添加a标签,并删除其他li的a标签 $(this).addClass("a").siblings().removeClass("a"); //获取li当前的索引值 var index = $(this).index(); //给对应的p标签加上on $(".content p").eq(index).addClass("on").siblings().removeClass("on"); }) </script> </body> </html>
课后练习
1、点击一级类别显示二级类别。
2、展开一个类别的同时,关闭其他类别。
3、一级类别展开和关闭的时候,对应的图标也要跟着改变。
4、用jquery实现网易首页女人、情感、亲自模块的页签切换效果。
要求:
1)、鼠标移动到女人上面的时候,显示女人栏目的内容。
2)、鼠标移动到情感上面的时候,显示情感栏目的内容。
3)、鼠标移动到亲子上面的时候、显示亲自栏目的内容。
4)、每个盒子里面的文章内容可以随便加,布局合理即可,主要练习jquery。
5、用jquery实现京东导航的效果。
面试题
1. $(function(){}) 与 $(window).load(function(){})的区别。
2. 如何解决动画的堆砌问题?