js事件(Event)知识整理


Posted in Javascript onOctober 11, 2012

鼠标事件

鼠标移动到目标元素上的那一刻,首先触发mouseover
之后如果光标继续在元素上移动,则不断触发mousemove
如果按下鼠标上的设备(左键,右键,滚轮……),则触发mousedown
当设备弹起的时候触发mouseup
目标元素的滚动条发生移动时(滚动滚轮/拖动滚动条。。)触发scroll
滚动滚轮触发mousewheel,这个要区别于scroll
鼠标移出元素的那一刻,触发mouseout

事件注册

平常我们绑定事件的时候用dom.onxxxx=function(){}的形式
这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄。
但很多时候我们需要绑定多个处理句柄到一个事件上,而且还可能要动态的增删某个处理句柄
下面的事件注册方式就能解决这个需求。

先介绍一下四个方法

//IE以外 
target.addEventListener(type,listener,useCapture) 
target.removeEventListener(type,listener,useCapture); 
target :文档节点、document、window 或 XMLHttpRequest。 
type :字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。 
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 
useCapture :是否使用捕捉,一般用 false。 
//IE 
target.attachEvent(type, listener); 
target.detachEvent(type, listener); 
target :文档节点、document、window 或 XMLHttpRequest。 
type :字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。 
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 
两者使用的原理:可对执行的优先级不一样,实例讲解如下: 
ele.attachEvent("onclick",method1); 
ele.attachEvent("onclick",method2); 
ele.attachEvent("onclick",method3); 
执行顺序为method3->method2->method1 
ele.addEventListener("click",method1,false); 
ele.addEventListener("click",method2,false); 
ele.addEventListener("click",method3,false); 
执行顺序为method1->method2->method3 
兼容后的方法 
var func = function(){}; 
//例:addEvent(window,"load",func) 
function addEvent(elem, type, fn) { 
if (elem.attachEvent) { 
elem.attachEvent('on' + type, fn); 
return; 
} 
if (elem.addEventListener) { 
elem.addEventListener(type, fn, false); 
} 
} 
//例:removeEvent(window,"load",func) 
function removeEvent(elem, type, fn) { 
if (elem.detachEvent) { 
elem.detachEvent('on' + type, fn); 
return; 
} 
if (elem.removeEventListener) { 
elem.removeEventListener(type, fn, false); 
} 
}

获取事件对象和事件源(触发事件的元素)
function eventHandler(e){ 
//获取事件对象 
e = e || window.event;//IE和Chrome下是window.event FF下是e 
//获取事件源 
var target = e.target || e.srcElement;//IE和Chrome下是srcElement FF下是target 
}

取消事件默认行为(例如点击一个<a>后不跳转页面而是执行一个函数)
function eventHandler(e) { 
e = e || window.event; 
// 防止默认行为 
if (e.preventDefault) { 
e.preventDefault();//IE以外 
} else { 
e.returnValue = false;//IE 
//注意:这个地方是无法用return false代替的 
//return false只能取消元素 
} 
}

阻止事件冒泡
function myParagraphEventHandler(e) { 
e = e || window.event; 
if (e.stopPropagation) { 
e.stopPropagation();//IE以外 
} else { 
e.cancelBubble = true;//IE 
} 
}

事件委托

例如,你有一个很多行的大表格,在每个<tr>上绑定点击事件是个非常危险的想法,因为性能是个大问题。流行的做法是使用事件委托。

事件委托描述的是将事件绑定在容器元素上,然后通过判断点击的target子元素的类型来触发相应的事件。
事件委托依赖于事件冒泡,如果事件冒泡到table之前被禁用的话,那以下代码就无法工作了。

myTable.onclick = function () { 
e = e || window.event; 
var targetNode = e.target || e.srcElement; 
// 测试如果点击的是TR就触发 
if (targetNode.nodeName.toLowerCase() === 'tr') { 
alert('You clicked a table row!'); 
} 
}

事件(Event)知识整理(二)

事件流

DOM同时支持两种事件模型:捕获型事件和冒泡型事件
并且每当某一事件发生时,都会经过捕获阶段->处理阶段->冒泡阶段(有些浏览器不支持捕获)

捕获阶段是由上层元素到下层元素的顺序依次。而冒泡阶段则正相反。

如下图
js事件(Event)知识整理

当事件触发时body会先得到有事件发生的信息,然后依次往下传递,直到到达最详细的元素。这就是事件捕获阶段。
还记得事件注册方法ele.addEventListener(type,handler,flag)吧,Flag是一个Boolean值,true表示事件捕捉阶段执行,false表示事件冒泡阶段执行。
接着就是事件冒泡阶段。从下往上 依次执行事件处理函数(当然前提是当前元素为该事件注册了事件句柄)。
在这个过程中,可以阻止事件的冒泡,即停止向上的传递。
阻止冒泡有时是很有必要的,例如

<div onclick=funcA()> 
<button onclick=funcB()>Click</button> 
</div>

本意是如果点击div中按钮以外的位置时执行funcA,点击button时执行funcB。但是实际点击button时就会先后执行funcB,funcA。
而如果在button的事件句柄中阻止冒泡的话,div就不会执行事件句柄了。

Javascript 相关文章推荐
select标记美化--JS式插件、后期加载
Apr 01 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
浅谈javascript面向对象程序设计
Jan 21 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
Jul 19 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
Feb 24 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
Oct 11 #Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 #Javascript
You might like
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
python如何写出表白程序
2020/06/01 Python
解决python运行效率不高的问题
2020/07/20 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
中专生自我鉴定范文
2013/12/19 职场文书
销售业务员岗位职责
2014/01/29 职场文书
公司接待方案
2014/03/08 职场文书
业务内勤岗位职责
2014/04/30 职场文书
庆七一活动总结
2014/08/27 职场文书
安全保证书怎么写
2015/02/28 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers