学习要点:
1.绑定事件
2.简写事件
3.复合事件
javaScript有一个非常重要的功能,就是事件驱动。当页面完全加载后,用户通过鼠标或键盘触发页面中绑定事件的元素即可触发。jquery为开发者更有效率的编写事件行为,封装了大量有益的事件方法供我们使用。
一、绑定事件
在javaScript课程的学习中,我们掌握了很多使用的事件,常用的事件click,dbclick,mousedown,mouseup,mousemove,mouseover,mouseout,change,select,submit,keydown,keypress,keyup,blur,focus,load,resize,scroll,error。那么,还有更多的事件可以参考手册中的事件部分。
jquery通过.bind()方法来为元素绑定这些事件。可以传递三个参数:bind(type,[date],fn),type表示一个或多个类型的事件的事件名字符串;[data]是可选的,作为event.data属性值传递一个额外的数据,这个数据是一个字符串、一个数字、一个数组或一个对象;fn表示绑定到指定元素的处理函数。
//使用点击事件
$("input").bind("click",function(){ //点击按钮后执行匿名函数
alert("点击"); });
//普通处理函数
$("input").bind("click",fn); //执行普通函数无需圆括号 function fn(){ alert("点击"); } //可以同时绑定多个事件 $("input").bind("mouseout mouseover",function(){ //移入和移出分别执行一次 $("div").html(function(index,value){ return value+"1"; }); }); //通过对象的键值对绑定多个参数 $("input").bind({ //传递一个对象 "mouseout":function(){ //事件名的引号可以省略 alert("移出"); }, "mouseover":function(){ alert("移入"); } }); //使用unbind删除绑定的事件 $("input").unbind(); //删除所有当前元素的事件 //使用unbind参数删除指定类型事件 $("input").unbind("click"); //删除当前元素的click事件 //使用unbind参数删除指定处理函数的事件 function fn1(){ alert("点击1"); } function fn2(){ alert("点击2"); } $("input").bind("click",fn1); $("input").bind("click",fn2); $("input").unbind("click",fn1); //只删除fn1处理函数的事件 二、简写事件 为了使开发者更加方便的绑定事件,jquery封装了常用的事件以便节约更多的代码。我们称它为简写事件。 click(fn):触发条件是鼠标,触发每一个匹配元素的click(单击)事件 dbclick(fn):触发条件是鼠标,触发每一个匹配元素的click(双击)事件 mousedown(fn):触发条件是鼠标,触发每一个匹配元素的mousedown(点击后)事件 mouseup(fn):触发条件是鼠标,触发每一个匹配元素的mouseup(点击弹起)事 mouseover(fn):触发条件是鼠标,触发每一个匹配元素的mouseover(鼠标移入)事件 mouseout(fn):触发条件是鼠标,触发每一个匹配元素的mouseout(鼠标移出)事件 mousemove(fn):触发条件是鼠标,触发每一个匹配元素的mousemove(鼠标移动)事件 mouseenter(fn):触发条件是鼠标,触发每一个匹配元素的mouseenter(鼠标穿过)事件 mouseleave(fn):触发条件是鼠标,触发每一个匹配元素的mouseleave(鼠标穿出)事件 keydown(fn):触发条件是键盘,触发每一个匹配元素的keydown(键盘按下)事件 keyup(fn):触发条件是键盘,触发每一个匹配元素的keyup(键盘弹起)事件 keypress(fn):触发条件是键盘,触发每一个匹配元素的keypress(键盘按下)事件 unload(fn):触发条件是文档,当卸载本页面时绑定一个要执行的函数 resize(fn):触发条件是文档,触发每一个匹配元素的resize(文档改变大小)事件 scroll(fn):触发条件是文档,触发每一个匹配元素的scroll(滚动条拖动)事件 focus(fn):触发条件是表单,触发每一个匹配元素的focus(焦点激活)事件 blur(fn):触发条件是表单,触发每一个匹配元素的blur(焦点丢失)事件 focusin(fn):触发条件是表单,触发每一个匹配元素的focusin(焦点激活)事件 focusout(fn):触发条件是表单,触发每一个匹配元素的focusout(焦点丢失)事件 select(fn):触发条件是表单,触发每一个匹配元素的select(文本选定)事件 change(fn):触发条件是表单,触发每一个匹配元素的change(值改变)事件 submit(fn):触发条件是表单,触发每一个匹配元素的submit(表单提交)事件 注意:这里封装的大部分方法都比较好理解,我们没必要一一演示确认,重点看几个需要注意区分的简写方法 mouseover()和mouseout()表示鼠标移入和移出的时候触发,那么jquery还封装了另外一组:mouseenter()和mouseleave()表示鼠标穿过和穿出的时候触发。那么这两组本质上有什么区别呢?手册上的说明是:mouseenter()和mouseleave()这组穿过子元素不会触发,而mouseover()和mouseout()则会触发 //html页面设置 <div style="width:200px;height:200px;background:green"> <p style="width:100px;height:100px;background:red;"><p> </div> <strong></strong> //mouseover移入 $("div").mouseover(function(){ //移入div会触发,移入p再触发 $("strong").html(function(index,value){ return value+"1"; } }); //mouseenter穿过 $("div").mouseenter(function(){ //穿过div或p $("strong").html(function(index,value){ //在这个区域只触发一次 return value+"1"; }); }); //mouseout移出 $("div").mouseout(function(){ //移出div会触发,移出p再触发 $("strong").html(function(index,value){ return value+"1"; }); });
//mouseleave穿出
$("div").mouseleave(function(){ //移出整个div区域触发一次
$("strong").html(function(index,value){
return value+"1";
});
});
keydown(),keyup()返回的是键码,而keypress()返回的是字符编码
$("input").keydown(function(e){
alert("e.keyCode"); //按下a返回65
});
$("input").keypress(function(e){
alert("e.charCode"); //按下a返回97
});
注意:e.keyCode和e.charCode在两种事件互换也会产生不同的效果,除了字符还要一些字符键的区别。更多详情可以了解JavaScript事件处理那章。
focus()和blur()分别表示光标激活和丢失,事件触发时机是当前元素。而focusin()和foucusout()也表示光标激活和丢失,但事件触发的时机可以是子元素。
//html部分
<div style="width:200px;height:200px;background:red;">
<input type="text" value=""/>
</div>
<strong></strong>
//focus光标激活
$("input").focus(function(){ //当前元素触发
$("strong").html("123");
});
$("div").focus(function(){ //绑定的是div元素,子类input触发
$("strong").html("123");
});
注意:blur()和focusout()表示光标丢失,和激活类似,一个必须当前元素触发,一个可以是子元素触发。
三、复合事件
jquery提供了许多最常用的事件效果,组合一些功能实现了一些复合事件,比如切换功能、智能加载等
ready(fn):当DOM加载完毕触发事件
hover([fn1,]fn2):当鼠标移入触发第一个fn1,移出触发fn2
toggle(fn1,fn2[,f3.....]):已废弃,当鼠标点击触发fn1,再点击触发fn2
//背景移入移出切换效果
$("div").hover(function(){
$(this).css("background","black"); //mouseenter效果
},function(){
$(this).css("background","red"); //mouseleave效果,可省
}
});
注意:.hover()方法是结合了.mouseenter()和mouseleave()方法,并非.mouseover()和mouseout()方法。
toggle()这个方法比较特殊,这个方法有两层含义,第一层含义就是已经被1.8版本废用、1.9版删除掉的用法,也就是点击切换复合事件的用法。第二层函数将会在动画那章讲解到。既然废弃掉了,就不应该使用。被删除的原因是:以减少混乱和提高潜在的模块化程度。
但你又非常想用这个方法,并且不想自己编写类似的功能,可以下载jquery-migrate.js文件,来向下兼容已被删除掉的方法。
//背景点击切换效果(1.9版删除掉了)
$("div").toggle(function(){ //第一次点击切换
$(this).css("background","black");
},function(){ //第二次点击切换
$(this).css("background","blue");
},function(){ //第二次点击切换
$(this).css("background","red");
});
注意:由于官方已经删除掉这个方法,所以也不是推荐使用的,如果在不基于向下兼容的插件JS。我们可以自己实现这个功能。
var flag=1; //计数器
$("div").click(function(){
if(flag==1){ //第一次点击切换
$(this).css("background","black");
flag=2;
}else if(flag==2){ //第二次点击切换
$(this).css("background","blue");
flag=3;
}else if(flag==3){ //第二次点击切换
$(this).css("background","red");
flag=1;
}
});