浅谈Javascript鼠标和滚轮事件


Posted in Javascript onJune 27, 2012

a)鼠标事件

鼠标事件也许是web页面当中最常用到的事件,因为鼠标是最常用的导航设备,在DOM3级事件上定义了9个鼠标事件,分别为:

click:当用户点击鼠标主键通常是指鼠标左键或按回车键时触发。

dbclick:当用户双击鼠标主键时发生触发,这个事件并没有在DOM2级事件中定义但是却被普遍支持了,后来在DOM3级中得到了标准化。

mousedown:当用户按下鼠标任意一个键都会触发,这个事件是不能够通过键盘触发的。

mouseenter:当鼠标图标从元素外移动至元素边界内时触发。该事件不支持冒泡,而且当鼠标在元素的上表面移动时负触发此事件。该事件不属于DOM2级事件,属于DOM3级后添加的事件,IE 、FF9+、以及opera支持此事件。

mouseleave:当鼠标处于元素上方,之后移出元素边界是触发该事件,与mouseenter事件相同,不支持冒泡,在元素上方是不触发,该事件不属于DOM2级事件,属于DOM3级后添加的事件,IE 、FF9+、以及opera支持此事件。

mousemove:当鼠标在某元素周围移动时重复触发,该事件不能通过键盘事件触发。

mouseout:当鼠标处于某一元素上方,之后移动到其他元素上方时触发。元素移动到原始元素的边界外,或者原始元素的子元素上,这个事件不能通过键盘触发。

mouseover:当用户将鼠标第一次从某元素边界外移动到该元素边界内时触发,这个事件不能够通过键盘触发。

mouseup:当用户释放鼠标按键是触发,这个事件不能够通过键盘触发。

页面上的所有元素都支持鼠标事件,除了mouseenter和mouseleave外,所有的事件都冒泡,并且他们的默认行为是可以被取消掉的。但取消鼠标事件的默认行为可能会影响到其他事件,因为有些鼠标事件是相互依赖的。

只有当一个mousedown事件和一个mouseup事件在同一个元素上触发,才能触发鼠标的click事件;假设任何一个事件被取消,click事件将永远不会被触发。相似的原理dbclick事件依赖于click事件,如果连续两次click事件中任意一次被取消,dbclick都不会被触发。常用的鼠标事件如下:

1.mousedown、2.mouseup、3.click、4.mousedown、5.mouseup、6.click、7.dbclick。

无论是click 还是 dbclick事件,都依赖于其他事件的触发。

你可以通过下面的代码来确定浏览器是否在dom2事件上支持鼠标事件,

var isSupport = document.implementation.hasFeature('MouseEvents','2.0');

然而值得注意的是在dom3级事件上检测则有些不同:

var isSupport = document.implementation.hasFeature('MouseEvent','3.0');

在鼠标事件上还包含一个子类事件,即wheel事件(滚轮事件)。在wheel事件中只包含一个事件,mousewheel事件,他反应鼠标滚轮或其他装置,如mac的touchpad的交互情况。

b)关联元素

对于mouseover和mouseout事件来说,还存在着与事件相关的元素,这连个事件所执行的动作包括,移动鼠标从一个元素边界内部到另一个元素边界内部。以mouseover事件为例,他的主要目标元素是鼠标将要移至的元素,而那个关联元素就是失去鼠标的那个元素。同样对于mouseout事件,主要目标是那个鼠标移出的元素,而关联元素则是获得鼠标的元素,DOM通过event对象上的relatedTarget属性来提供关联元素的信息,IE8或更早版本的IE不支持relatedTarge属性,但却提供了与其功能相类似的fromElement属性和toElement属性。在IE下,当mousemove事件触发时,event对象的fromElement包含着关联元素,当mouseout事件触发时,event的toElement属性包含着关联元素。在IE9中支持所有的属性,一个跨浏览器的getRelatedTarget方法可以这样写:

var eventUtil = { 
getRelateTarget:function(event){ 
if (event.relatedTarget) { 
return event.relatedTarget; 
}else if(event.fromElement){ 
return event.fromElement; 
}else if(event.toElement){ 
return event.toElement; 
}else { 
return null; 
} 
} 
};

c)buttons

click事件只有当鼠标主键点击了某一元素的时候才会触发(或者当某一元素获得焦点时按下回车键),对于mousedown和mouseup来说,在事件对象event上存在一个属性button,他可以确定是哪个键按下或者释放。在DOM实现的button属性值通常有三种可能:

0:代表主键,

1:代表滚轮,

2:代表副键。

在一般情况下主键指的是鼠标的左键,副键代表鼠标右键。

从IE8开始也提供了button属性,但却有着完全不同的取值范围: 

0 :没有按键按下,

1 :主键已经被按下,

2 :代表副键已经被按下,

3 :主键副键都被按下,

4 :代表中间键被按下,

5 :代表主键和中间件被按下,

6 :代表副键和中间键被按下,

7 :代表三个键都被按下。

可见DOM 模型下的button属性的取值范围比IE模型下的取值范围要简单的多,而且个人觉得ie下的操作情况略显变态。

d)其他事件信息

在DOM2级事件上,为事件对象event还提供了detail属性来提供更多的事件信息,例如对于点击事件来说,detail可以记录同一像素位置的点击次数,detail的值是从1开始计数的,每次点击后加一,如果在mousedown和mouseup之间,鼠标发生移动,这个值将会被清零。

关于鼠标事件就先写这些,日后在慢慢补全。

Javascript 相关文章推荐
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
vue的props实现子组件随父组件一起变化
Oct 27 Javascript
Bootstrap基本插件学习笔记之折叠(22)
Dec 08 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
原生JS实现列表子元素顺序反转的方法分析
Jul 02 Javascript
tsconfig.json配置详解
May 17 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
Jul 07 Javascript
vue+iview实现文件上传
Nov 17 Vue.js
浅谈Javascript事件模拟
Jun 27 #Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 #Javascript
基于jquery & json的省市区联动代码
Jun 26 #Javascript
jquery命令汇总,方便使用jquery的朋友
Jun 26 #Javascript
Jvascript学习实践案例(开发常用)
Jun 25 #Javascript
来自国外的30个基于jquery的Web下拉菜单
Jun 22 #Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 #Javascript
You might like
mysql 搜索之简单应用
2007/04/27 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
jquery 图片轮换效果
2010/07/29 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
python fabric实现远程部署
2017/01/05 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
中职应届生会计求职信
2013/10/23 职场文书
两则小学生的自我评价分享
2013/11/14 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
幼儿园门卫制度
2014/01/29 职场文书
cf收人广告词
2014/03/14 职场文书
中国好声音华少广告词
2014/03/17 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
办公室个人总结
2015/02/28 职场文书
法定代表人资格证明书
2015/06/18 职场文书
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
python 镜像环境搭建总结
2022/09/23 Python