小议jQuery中的事件那些我们知道和不知道的秘密
学了jQuery这么长时间,到这里真的有一种柳暗花明又一村的感觉,在这里先表达一下自己学这一章节的happy心情吧(在严厉的金工实习老师眼皮底下偷偷学习,当然还有各种nerves~)。
1加载DOM
在JS中浏览器装载文档通常使用window.onload方法,而在jQuery中使用的是$(document).ready()方法~这两人区别在哪里呢,JS必须等每一幅图片加载完毕后才能进行操作,网页的所有元素对jQuery而言都是可以访问的,但这并不意味着这些元素关联的文件都已经下载完毕哦,只要DOM就绪就可以操作了,何苦等所有图片都下载完毕,so,速度就这样相形见绌了~还有一点就是JS的onload事件一次只能保存对一个函数的引用,他会自动用后面的函数覆盖前面的函数,因而不在现有的行为上添加新的行为,所以为了达到两个函数顺序触发的效果JS会选择
1 window。onload=function(){ 2 one(); 3 two(); 4 }
但这种方法不能解决某些需求例如多个文件使用window.onload方法加载多个JS文件。这样我们就可以每次调用$(document).ready()方法在现有行为上追加新的行为
1 function one(){ 2 alert("one"); 3 } 4 function two(){ 5 alert("two"); 6 } 7 $().ready(function(){ 8 one(); 9 }) 10 $().ready(function(){ 11 two(); 12 });
2事件绑定
bind()方法调用格式为
bind(type [,data], fn);
第二个参数为可选参数,作为event.data属性值传递给事件对象的额外数据对象。
与ready()方法一样,bind()方法也可以多次调用,在代码中如果发现$(this).next()被多次调用,可以为它定义一个局部变量
1 $(function(){ 2 $("#panel h5.head").bind("click",function(){ 3 var $content=$(this).next(); 4 if($content.is(":visible")){ 5 $content.hide(); 6 }else{ 7 $content.show(); 8 } 9 }) 10 })
改变绑定事件的类型及简写绑定事件
1 $(function(){ 2 $("#panel h5.head").mouseover(function(){ 3 $(this).next().show(); 4 }).mouseout(function(){ 5 $(this).next().hide(); 6 }) 7 })
3合成事件
jQuery有两个合成事件,那就是被我们灰常广泛的应用的hover()和toggle()方法,属于自定义方法。
hover()方法的结构为:
hover(enter,leave);该方法用于模拟光标悬停事件,当光标移动到元素上时会触发指定的enter,移出时会触发leave.
eg:
$(function(){ $("#panel h5.head").hover(function(){ $(this).next().show(); },function(){ $(this).next().hide(); }); });
toggle()方法可谓是老生常谈了,这里就不多啰嗦什么了吧~
结构:
toggle(fn1,fn2,fn3,...fnN);模拟鼠标连续单击事件,每次单击都是重复对这几个函数的轮番调用。
4事件冒泡和事件捕获
事件冒泡和事件捕获是一个相反的过程。
很多情况下事件冒泡会产生很多问题,那么如何停止事件冒泡呢~(event.stopPropagation();可谓是杀手锏~
5阻止默认行为
网页中的元素有自己的默认行为,eg单击超链接人家就会跳转,单击提交按钮后表单会提交,但有时我们需要阻止元素的默认行为,
比如当表单不符合提交条件时要阻止表单的提交。在jQuery中我们亮剑"preventDefault()"方法来阻止元素的默认行为。
1 <script type="text/javascript"> 2 $(function(){ 3 $("#sub").bind("click",function(event){ 4 var usename=$("#username").val(); 5 if(username==""){ 6 $("#msg").html("<p>文本框内容不能为空</p>>"); 7 event.preventDefault(); 8 9 } 10 }); 11 }) 12 13 </script> 14 <form action="test.html"> 15 用户名:<input type="text" id="username"/> 16 <input type="submit" value="提交" id="sub"/> 17 </form> 18 <div id="msg"></div>
如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返回false。
return false;
这可比同时调用event.preventDefault();//阻止默认行为 和 event.stopPropagation();//停止事件冒泡 简单快捷多了~
6事件对象的属性
event.type,event.target.event.relatedTarget,event.pageX和event.pageY这些属性就看名字也就明白是怎么回事了,就不多说废话了。
event.which
1 $("a").mousedown(function(e){ 2 alert(e.which)//1=鼠标左键 2=鼠标中键 3=鼠标右键 3 })
event.metaKey
众所周知,不同浏览器对<ctrl>按键的解释是不同的,有道是魔高一尺道高一丈,针对这个问题,jQuery对此进行了封装,并规定event.metaKey为键盘事件中获取<ctrl>按键。
7移除事件
关于移除事件那点说小不小的事,除了我们所熟悉的unbind()方法还有一个神奇的东西,one()方法,该方法对绑定的函数只触发一次,随后立即解除绑定关系。
8模拟操作
很多情况下是用户通过单击按钮等操作才能触发click事件,但在很多很多情况下需要模拟用户操作,这样有什么好处呢,外卖都送到宿舍门口了,不需要用户单击的才是更方便的啊~
trigger()不仅可以触发浏览器支持的具有相同名称的事件比如click ,也可以触发自定义名称的事件,关键是人家还可以传递参数
1 $("#btn").trigger("click"); 2 3 $("#btn").trigger("myClick"); 4 5 $("#btn").trigger("myClick",["我的自定义"。“事件”]);
9相关元素的其他用法
A绑定多个事件类型
1 $(function(){ 2 $("div").bind("mouseover mouseout",function(){ 3 $(this).toggleClass("over"); 4 }); 5 });
2添加事件命名空间,便于管理
例如可以把为元素绑定的多个事件类型用命名空间规范起来
1 $(function(){ 2 $("div").bind("click.plugin",function(){ 3 $("body").append("<p>click事件</p>"); 4 $("div").bind("mouseover.plugin",function(){ 5 $("body").append("<p>mouseover事件</p>"); 6 $("div").bind("dblclick.plugin",function(){ 7 $("body").append("<p>dblclick事件</p>"); 8 }); 9 $("button").click(function(){ 10 $("div").unbind(".plugin")}; 11 }); 12 });
未完待续......
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。