鼠标和滚轮事件
鼠标事件是Web开发中最常用 的一类事件,毕竟鼠标还是最主要的定位设备。 DOM3级事件中定义了9个鼠标事件。 简介 如下:

  • click:在用户单击主鼠标按钮(一般是左边的按钮)或着按下回车键时触发。 这一点对确保易访问性很生要, 意味着onclick事件处理程序即可以通过键盘也可以通过鼠标执行。
  • dblclick:在用户双击主鼠标按钮时触发。从技术 上来,这个事件并不是DOM2级事件规范中规定的,但鉴于它得到了广泛支持,所以DOM3级事件将其纳入了标准;
  • mousedown:在用户按下了任意鼠标按钮时触发。不能通过键盘触发这个事件。
  • mouseenter:在鼠标光标从元素外部首次移动到元素范围之内时触发。这个事件不冒泡,而且在光标移动到后代元素上不会触发。DOM2级事件并没有 定义这个事件,但DOM3级事件将它纳入了规范。IE Firefox9+和Opera支持这个事件。
  • mouseleave:在们于元素上方鼠标光标移动到元素范围之外时触发。这个事件不冒泡,而且在光标移动后代元素上不会触发。DOM2级事件并没有 定义这个事件,但DOM3级事件将它纳入了规范。IE Firefox9+ 和 Opera支持这个事件。
  • mousemove:当鼠标指针在元素内部移动时重复地触发,不能通过键盘触发这个事件。
  • mouseout:在鼠标指针位于一个元素上方,然后用户将其移入另一个元素时触发。又移入的另一个元素可能位于前一个元素的外部,也可能是这个元素的子元素。不能通过键盘触发这个事件。
  • mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发。不能通过键盘触发 这个事件。
  • mouseup:在用户释放鼠标按钮时触发。不能通过键盘触发这个事件。

页面上的所有元素都支持鼠标事件。除了mouseenter和mouseleave,所有根植事件都会冒泡,也可以被取消,而取消鼠标事件将会影响浏览器的默认行为。取消鼠标事件的默认行为还会影响 其他事件,转为鼠标事件与其他事件是密不可分的关系。

只有在同一个元素上相继触发mousedown和mouseup事件,才会触发click事件;如果mousedown或mouseup中的一个被取消,就不会触发click事件。类似地,只有触发再次click事件,才会触发一次dblclick事件。如果有代码阻止了连续两次触发click事件(可能是直接取消click事件,也可能通过取消mousedown或mouseup间接实现),那么就不会触发dblclick事件了。这4个事件触发 的顺序始终如下:
* mousedown
* mouseup
* click
* mousedown
* mouseup
* click
* dblclick

显然,click和dblclick事件都会依赖于其他先行事件的触发;而mousedown和mouseup则不爱其他事件影响;
IE8及之前版本中的实现有一个小Bug,因此在双击事件中,会跳过第二个mousedown和click事件,基顺序如下:
* mousedown
* mouseup
* click
* mouseup
* dblclick

IE9修复了这个Bug,之后就正确了

使用以下代码可以检测浏览器是否支持以上DOM2级事件(除dblclick mouseneter和mouseleave之外);

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

要检测浏览器是否支持上面的所有事件,可以使用以下代码:

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

注意,DOM3级事件的feature名是“MouseEvent”,而非“MouseEvents”;

鼠标事件中还有一类滚轮事件。而说的是一类事件,其实就是一个mousewhee事件。这个事件跟踪鼠标滚轮,类似 于 mac的触控板。

1、客户区坐标位置

鼠标事件都是在浏览器视口的特定位置上发生的。这个位置信息保存在事件对象的clientX和clientY属性中。所有浏览器都支持这两个属性,它们的值表示事件发生时鼠标指针在视口的水平和垂直坐标;

可以使用类似下列代码取得鼠标事件的客户端坐标信息:

var div = document.getElementById('myDiv');
EventUtil.addhandler(div,'click', function(event){event = EventUtil.getEvent(event);alert("Client coordinates: " + event.clientX + ","+event.clientY);
})

这里为一个<div>元素指定了 onclick事件处理程序。当用户单击这个元素时,就会看到事件的客户端坐标信息。注意这些值中不包括页面流动的距离。这个位置并不表示 鼠标在页面上的位置;

2、页面坐标位置

通过客户区坐标能够知道鼠标是在视口中发什么位置发生的,而页面坐标通过事件对象的pageX和pageY属性,能告诉你事件是在页面中的什么位置发生的。换句话说,这两个属性表示鼠标光标在页面中的位置,坐标是从页面本身而非视口中的左边和顶边计算的。

var div = document.getElementById('myDiv');
EventUtil.addhandler(div,'click', function(event){event = EventUtil.getEvent(event);alert("Client coordinates: " + event.pageX + ","+event.pageY);
})

在页面没有滚动条的情况下,pageX和pageY的值与clientX和clientY的值相等。

IE8及更早版本不支持事件对象上的页面坐标,不过使用客户区坐标和滚动信息可以计算出来。这时候需要用到document.body或document.documentElement中的scrollLeft和scrollTop属性。计算 过程如下 所示 :

var div = document.getElementById('myDiv');
EventUtil.addhandler(div,'click', function(event){event = EventUtil.getEvent(event);var pageX = event.pageX,pageY = event.pageY;if( pageX == undefined)  {pageX = event.clientX + (document.body.scrollLeft  || document.docuemntElement.scrollLeft);}if( pageY == undefined)  {pageY = event.clientY + (document.body.scrollTop || document.docuemntElement.scrollTop);}alert("page coordinates: " + pageX + ","+pageY);
})

3、屏幕坐标位置

鼠标事件发生时,不仅会有相对于浏览器窗口位置,还会有一个相对于整个电脑屏幕的位置。而通过screenX和screenY属性就可以确定鼠标事件发生时鼠标指针相对于整个屏幕的坐标信息。

可以使用类似下列代码取得鼠标事件的屏幕坐标信息:

var div = document.getElementById('myDiv');
EventUtil.addhandler(div,'click', function(event){event = EventUtil.getEvent(event);alert("screen coordinates: " + event.screenX + ","+event.screenY);
})

与胶一个例子类似,这里也是为<div>元素指定了一个onclick事件处理程序。当这个元素被单击时,就会显示出事件屏幕坐标信息了。

4、修改键

虽然鼠标事件主要是使用鼠标来触发的,便在按下鼠标时键盘上的某些键的状态也可以影响到所要采取的操作。这些修改键主是Shift\Ctrl\Alt和Meta(在window键盘中是Windows键,在苹果机中是Cmd键),它们经常被用来修改鼠标事件 的行为 。DOM为此规定4个属性,表示这些修改键的状态,shiftKey,ctrlKey,altKey和metaKey。这些属性中包含的都是布尔值,如果相应的键被按下了,则值为true,否则值为false。当某个鼠标事件发生时,通过检测这几个属性就可以确定用户是否同时按下其中的键。来看下面例子:

var div = document.getElementById('myDiv');
EventUtil.addhandler(div,'click', function(event){event = EventUtil.getEvent(event);var keys = new Array();if( event.shiftKey) {keys.push('shift');}if( event.ctrlKey) {keys.push('ctrl');}if( event.altKey) {keys.push('alt');}if( event.metaKey) {keys.push('meta');}alert("Keys"+ keys.join(','));
})

在这个例子中,我们通过一个onclick事件处理程序检测了不同修改键的状态。数组keys中包含着被按下修改键的名字。换句话说,如果有属性值为true,就会将对应修改键的名称添加到keys数组中。在事件处理程序的最后,有一个警告框检测到的键的信息显示给用户。

IE9 Firefox Safari Chrome Opera都支持这4个键,IE8及之前版本不支持metaKey属性

5、相关元素

在发生mouseover和mouseout事件时,还会涉及更多的元素。这两个事件都会涉及把鼠标指针从一个元素的边界之内 移动 到另一个元素的边界之内。对mouseover事件而言,事件 的主要目标是获得光标的元素,而相关元素就是那个失去坐标的元素。类似地,对 mouseout事件而言,事件的主要目标是失去光标的元素,而相关元素则光标的元素。

DOM通过evnet对象的relatedTarget属性提供的相关元素信息。这个属性只对于mouseover和mouseout事件才包含值 ,对于 其它事件 ,这个属性的值 是null,IE8及之前版本不支持relatedTarget属性,但提供了保存着同样信息的不同属性。 在mouseover事件触发时,IE的fromeElement属性中保存了相关元素;在mouseout触发时,IE的toElement属性中保存着相关元素。(IE9支持所有 这些属性)可以把下面这个跨 浏览器取得相关绵方法 添加到EventUti对象中。

var  EventUtil = {//省略了其他代码getRelatedTarget: function(event) {if(event.relatedTarget) {return event.relatedTarget;} else  if( event.toElement) {return event.toElement;} else if (event.fromElement ) {return event.fromElement;} else {return null;}}
}

6、鼠标按钮

只有在主鼠标按钮被单击(或键盘回车键被按下)时才会触发click事件,因此检测按钮的信息并不是必要的。但对于mousedown和mouseup事件来说,则在其event对象存在 一个button属性,表示 按下或释放的按钮。DOM的button属性可能有如下3个值:0表示主鼠标按钮,1表示中间的鼠标按钮(鼠标滚轮按钮),2:表示次鼠标按钮。在常规的设置中,主鼠标按钮就是鼠标左键,而次鼠标按钮就是鼠标右键;

IE8及之前版本也提供了button属性,但这个属性的值和DOM的button属性有很大差异。
* 0:表示没有按下按钮
* 1:表示按下了主鼠标按钮
* 2:表示按下了次鼠标按钮
* 3:表示同时按下了主、次鼠标按钮
* 4:表示按下了中间的鼠标按钮
* 5:表示同时按下了主鼠标按钮和中间的鼠标按钮
* 6:表示同时按下了次鼠标按钮和中间的鼠标按钮
* 7:表示同时按下了三个鼠标按钮

不难想见,DOM模型下的button属性比IE模型 下的button属性更简单也更为实用,同时按下多个鼠标按钮的情况十分罕见。最常见的做法就是将IE模型 规范化为DOM方式,毕竟除了IE8及更早版本之外的其他浏览器都原生 支持DOM模式。而对主、中、次按钮的映射并不困难,只要IE的其他选项分别转换成如同按下 这三个按钮的一个即可(同时将主按钮作为优先选取的对象)。换句话说,IEk返回的5和7会被转换成DOM模型中的0;

由于单独使用能力检测无法确定差异(两种模型有同名的button属性),因此必须另辟路径。我们知道,支持DOM版本鼠标事件的浏览器可以通过hasFeature()方法来检测,所以可以再为EventUtil对象添加如下getButton()方法。

var  EventUtil = {//省略了其他代码getButton: function(event) {if(document.implementation.hasFeature('MouseEvents',"2.0")) {return event.button;} else {switch(event.button) {case 0:case 1:case 3:case 5:case 7:return 0;case 2:case 6:return 2;case 4:return 1;}}}//省略了其他代码
}

在使用onmouseup事件处理程序时,button的值表示释放的是哪个按钮。此外,如果不是按下或释放了主鼠标按钮,Opera不会触发mouseup或mousedown事件

还在更新中。。。。。

JS事件之事件类型[鼠标和滚轮事件]相关推荐

  1. 鼠标滚轮事件java_JavaScript 事件——“事件类型”中“焦点、鼠标和滚轮事件”的注意要点...

    焦点事件 一般利用这些事件与document.hasFocus()方法和document.activeElement属性配合.主要有: blur:元素失去焦点,不会冒泡: DOMFocusIn:同HT ...

  2. 13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】

    鼠标事件是Web 开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.DOM3 级事件中定义了9 个鼠标事件,简介如下. click:在用户单击主鼠标按钮(一般是左边的按钮)或者按下回车键时触发.这 ...

  3. mouseEvent事件——mouse坐标描述——focus事件——input事件——节流(thorttle)——mouseWheel(滚轮事件)

    这里写目录标题 mouseEvent事件 知识卡片 关于mouse位置的几个坐标描述 focus聚焦事件 input事件 节流(thorttle): mouseWheel(滚轮事件) mouseEve ...

  4. js事件详解二:鼠标和滚轮事件

    概述 鼠标事件是web开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.在DOM3级事件中定义了9个鼠标事件,分别是:click,dbclick,mousedown,mouseenter,mous ...

  5. qt练习11 鼠标,按键,滚轮事件学习

    源代码: http://files.cnblogs.com/hnrainll/event.zip

  6. python获取键盘事件_50-用Python监听鼠标和键盘事件

    PyHook是一个基于Python的"钩子"库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在W ...

  7. Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序

    很多时候只是要暂停一下或只想关闭监听,并不想把程序关闭. 但是网上搜了半天,没有找到,然后自己就去翻了翻源码,发现了. 开启监听是: HookMouse()和HookKeyboard() 暂停监听是: ...

  8. 鼠标滚轮事件(mousewheel / DOMMouseScroll)兼容性处理

    鼠标滚轮事件(mousewheel / DOMMouseScroll)兼容性处理 非Firefox浏览器中 在非 Firefox 浏览器中,使用 mousewheel 事件来监听鼠标的滚轮事件,通过事 ...

  9. html js鼠标滚轮事件,JS事件-鼠标滚轮事件

    之前学习了onmouseover,onmousedown等鼠标事件,今天来看看鼠标的滚轮事件,浏览器兼容一直是让人比较恶心的事情,今天就让我们将恶心进行到底,看看这个恶心的鼠标滚轮事件! 鼠标滚轮事件 ...

  10. java响应鼠标滚轮事件_鼠标滚轮事件MouseWheel

    其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+,Chrome)中,都提供了 "mousewheel" 事件.但杯具的是 Firefox ...

最新文章

  1. map写法 scala语言_Scala中的Map使用例子
  2. 技术分享|集成开放平台使用Consul Watch机制实现配置热更新
  3. python开发项目架构图_我的第一个python web开发框架(8)——项目结构与RESTful接口风格说明...
  4. 【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
  5. Qt定时器QTimer使用教程与代码演示
  6. linux sys文件的创建
  7. Mongodb数据库(上)
  8. 基于UML软件建模的企业人事管理系统
  9. gcr.io 国内源 —— 基于 Travis CI + GitHub + DockerHub + Google Cloud 实现自动定时同步 gcr.io 镜像到 DockerHub
  10. 深入了解JVM之线上问题排查及工具使用(五)
  11. 计算机制图符号制作,基本流程图的制作-通过在线制图工具绘制
  12. python爬虫实训心得_python实训心得体会
  13. 修改演武今日可用数据显示
  14. 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖
  15. ITE 在vs下可以模拟,在ite下无法编译
  16. 远程命令执行漏洞与远程代码执行漏洞33333
  17. 电脑开机时自动开启小键盘
  18. python如何识别特殊字符_如何判断特殊字符?,Python交流,技术交流区,鱼C论坛 - Powered by Discuz!...
  19. 阿里AI天池大赛-二手车交易价格预测-回归算法与模型融合
  20. 某某行政处罚_sojson_v6学习案例

热门文章

  1. python读书心得体会_终于领会学习python的心得体会
  2. ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)解决办法
  3. SM9学习笔记与图解(合集)
  4. 自组织特征映射神经网络(SOM)
  5. Latex 公式左对齐
  6. 决策树、随机森林及代码实战
  7. Ubuntu 各版本号和名称对照
  8. Python基础之列表、元组、字典、集合
  9. 定时任务task:annotation-driven配置
  10. php 问卷调查,使用php问卷调查结果统计