浅谈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 相关文章推荐
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
jQuery实现判断滚动条到底部
Jun 23 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
Nov 27 Javascript
AngularJS上拉加载问题解决方法
May 23 Javascript
AngularJS中$http的交互问题
Mar 29 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
vue中过滤器filter的讲解
Jan 21 Javascript
vue props 单项数据流实例分享
Feb 16 Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
js+css实现全屏侧边栏
Jun 16 Javascript
vue实现点击出现操作弹出框的示例
Nov 05 Javascript
浅谈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
php动态生成JavaScript代码
2009/03/09 PHP
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
vue实现信息管理系统
2020/05/30 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
python机器学习之决策树分类详解
2017/12/20 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
配置管理计划的主要内容有哪些
2014/06/20 面试题
客服工作职责
2013/12/11 职场文书
优秀员工推荐材料
2014/12/20 职场文书
世界红十字日活动总结
2015/02/10 职场文书
table不让td文字溢出操作方法
2022/12/24 HTML / CSS