初窥JQuery(二)事件机制(2)


Posted in Javascript onDecember 06, 2010

简单的说Jquery的事件处理机制就相当与在HTML标签中指定各种事件,比如onclick(),keydown()等,在标签中指定事件对应到Javascript的函数,便于我们实现我要求。而JQuery的事件处理则是将这些事件绑定到脚本内部,使我们无须将函数暴露在标签中,而且使用起来非常方便。

 

在介绍方法之前,我觉得有必要描述一下响应事件的两种策略,一种是事件捕获(Event capturing),一种是事件冒泡(Event bubble),这两种策略是相对立的,它们是在浏览器大战中分别由Netscape和微软提出的完全相反的两种事件传播模型。事件冒泡定义为在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层。而事件捕获则与事件冒泡则恰好相反,处理事件是从对象的最外层往里传播,直到终止。W3C标注是支持两种事件处理策略的,但是却更偏向于事件冒泡,因为事件捕获Bug较多,目前IE是不支持事件捕获的,其他浏览器基本两种都支持。下面我给一个事件冒泡的例子,自己试一下就明白了,至于事件捕获就算了.....
事件冒泡

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>JavaScript事件冒泡</title> 
<style type="text/css"> 
#box {width:200px; height:100px; border:2px solid red} 
#box h5 {margin:0; padding:2px 5px; font-size:18px; text-align:right; background:red; cursor:move} 
#box h5 a {text-decoration:none; color:#FFF} 
#box div{ white-space:inherit;} 
</style> 
</head> 
<body> 
<div id="box"> 
<h5 onmousedown="startDrag();"><a onmousedown="closeBox();" href="javascript:void(0);">关闭</a></h5> 
<div id="testInfo"></div> 
</div> 
<script type="text/javascript"> 
function startDrag() { 
document.getElementById('testInfo').innerHTML += '层事件'; 
} 
function closeBox(e) { 
document.getElementById('testInfo').innerHTML += '关闭事件'; 
//将下面一段注释去掉则可以阻止冒泡 
// if (e && e.stopPropagation) 
// e.stopPropagation(); 
// else 
// window.event.cancelBubble = true; 
} 
</script> 
</body> 
</html>

那么在JQuery中阻止事件策略的方法有event.preventDefault();(阻止默认行为)、event.stopPropagation();event.stopImmediatePropagation();(阻止事件冒泡)、直接返回return false;(阻止默认行为和时间冒泡)。

事件处理包括bind(type,[data],fn)、bind(map)、one(type,[data],fn)、trigger(type,[data])、triggerHandler(type,[data])、unbind([type],[data])这几个方法。

1、bind(type,[data],fn)用于为指定元素绑定指定的事件处理函数,[data]代表可选的传递的参数,它的写法为:

//带参数的绑定方式 
$("#text").bind('click', { result: "yes" }, function(event) { 
alert(event.data.result); 
}) 
//不带参数并且阻止冒泡 
$("#text").bind('click', function(e) { 
//自定义处理行为 
e.stopPropagation(); 
})

其实bind(type,[data],fn)这种绑定事件的方式我们还有一种简写的方式,但是他们的区别在于简写方式不能如bind一样指定参数[data],他的写法就是直接将bind中type参数执行,如下:
$("#text").click(function(e) { 
//自定义处理行为 
alert("简写方式"); 
})

2、bind(map)就是一次性为元素绑定多个事件处理函数,写法如下
$('#text').bind({ 
click: function() { 
alert("bind(map)绑定的click事件"); 
}, 
mouseenter: function() { 
alert("bind(map)绑定的mouseenter事件"); 
} 
});

3、one(type,[data],fn)指定事件只执行一次,写法与bind()方法一样,在此就不做示范。

4、trigger(type,[data])、triggerHandler(type,[data])其实作用是一样的,都是在每一个匹配的元素上触发某类事件,唯一的区别就是前者是执行事件冒泡事件的,而后者只执行指定元素的事件。下面做个比较:

//HTML代码: 
<button id="trigger">trigger()</button> 
<button id="triggerHandler">triggerHandler()</button><br/><br/> 
<div id="triggerdiv"> 
<div id="tri"></div> 
</div> 
//JQuery代码 
$("#triggerdiv").click(function() { 
alert("DIV触发"); 
}); 
$("#trigger").click(function() { 
$("#tri").trigger("click"); 
}); 
$("#triggerHandler").click(function() { 
$("#tri").triggerHandler("click"); 
}); 
$("#tri").click(function() { 
alert("子集DIV触发"); 
});

5、unbind([type],[data])就再简单不过了,删除指定元素的绑定事件,如果指定type参数则删除指定的事件,如果没有指定则删除该指定元素的所有事件。

在这些事情机制中我最常用到的还是bind方法,再常用的就是它的简写方式。当然这些事件机制是可以结合起来用的,关键看业务需求而定。

前面有人说我写的太简单了,在这里我也再次声明一下,我讲的是基础,我本身接触JQuery也没多久,用意在于加深自己记忆和给刚学习JQuery的朋友一些资料而已,并不是想说我JQuery很厉害。希望大家共同学习,一起进步。未完待续......

Javascript 相关文章推荐
javascript语句中的CDATA标签的意义
May 09 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
Jan 23 Javascript
利用javascript数组长度循环数组内所有元素
Dec 27 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
了不起的node.js读书笔记之例程分析
Dec 22 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
Apr 02 Javascript
2010年最佳jQuery插件整理
Dec 06 #Javascript
jquery提升性能最佳实践小结
Dec 06 #Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 #Javascript
使用JS进行目录上传(相当于批量上传)
Dec 05 #Javascript
js对象的构造和继承实现代码
Dec 05 #Javascript
收集的一些Array及String原型对象的扩展实现代码
Dec 05 #Javascript
script标签的 charset 属性使用说明
Dec 04 #Javascript
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
Django REST framework视图的用法
2019/01/16 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python实现海螺图片的方法示例
2019/05/12 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
乔迁宴答谢词
2014/01/21 职场文书
工厂会计员职责
2014/02/06 职场文书
迎国庆演讲稿
2014/09/05 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS