热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

事件类型鼠标与滚轮事件

DOM3级事件中定义了以下9个鼠标事件:click:在用户单击主鼠标按钮或者按下回车键时触发。意味着onclick事件处理程序既可以通过键盘也可以i通过

DOM3级事件中定义了以下9个鼠标事件:

  1. click:在用户单击主鼠标按钮或者按下回车键时触发。意味着onclick事件处理程序既可以通过键盘也可以i通过鼠标执行。
  2. dbclick:在用户双击主鼠标按钮时触发。(在DOM2中没有规定,在DOM3中做了规定)
  3. mousedown:在用户按下任意鼠标按钮时触发。
  4. mouseenter:在鼠标光标从元素外部首次移动到元素范围之内时触发。(在DOM2中没有规定,在DOM3中做了规定)
  5. mouseleave:在位于元素上方的鼠标光标移动到元素范围之外时触发。(在DOM2中没有规定,在DOM3中做了规定)
  6. mousemove:当鼠标指针在元素内部移动时重复的触发。
  7. mouseout:在鼠标位于一个元素上方,然后移动到另一个元素时触发,另一个元素可以位于另一个元素的外部,也可以是这个元素的子元素;不能通过键盘触发。
  8. mouseover:在鼠标位于一个元素外部,然后将其首次移动到另一个元素边界之内时触发;不能通过键盘触发
  9. mouseup:释放鼠标按钮时触发;不能通过键盘触发。

除了mouseenter、mouseleave、dbclick是“DOM3级事件”新增之外,其它事件都是“DOM2级事件”中定义的。
在一个元素上相继触发mousedown和mouseup事件,才会触发click事件。两次click事件相继触发才会触发dblclick事件。如果取消 了mousedown或mouseup中的一个,click事件就不会被触发。直接或间接取消了click事件,dblclick事件就不会被触发了。
四个事件的触发顺序如下:
(1)mousedown
(2)mouseup
(3)click
(4)mousedown
(5)mouseup
(6)click
(7)dbclick
可以使用如下代码检测浏览器是否支持“DOM2级”鼠标事件:

var isSupported = document.implementation.hasFeature("MouseEvents", "2.0");alert(isSupported); //true

 

是否支持“DOM3级”鼠标事件:

var isSupported = document.implementation.hasFeature("MouseEvent", "3.0");alert(isSupported); //true

注意:“DOM3级”鼠标事件的feature名为MouseEvent;而“DOM2级”为MouseEvents。
滚轮事件其实就是一个mousewheel事件。

1、客户区坐标位置

通过事件对象event的clientX和clientY属性,可以访问事件发生时鼠标指针在视窗中的水平和垂直坐标。

EventUtil.addHandler(document, "click", function(event) {event =EventUtil.getEvent(event);alert("鼠标指针客户区坐标为:水平距离—" + event.clientX + ";" + "垂直距离—" + event.clientY + "");});

 

注意:这些值不包括页面滚动的距离,因此这个位置并不表示鼠标在页面上的位置。

2、页面坐标位置

客户区坐标可以知道鼠标是在视口的什么位置发生的,而通过事件对象event的pageX和pageY属性,可以访问事件发生时鼠标指针在页面中的水平和垂直坐标。

EventUtil.addHandler(document, "click", function(event) {event = EventUtil.getEvent(event);alert("鼠标指针页面坐标为:水平距离—" + event.pageX + ";" + "垂直距离—" + event.pageY);
});

 

在页面没有滚动的情况下,pageX和pageY的值与clientX和clientY的值相等。
IE8及更早版本不支持事件对象上的页面坐标,不过可以使用客户区坐标和滚动信息计算出来。需要用到document.body(混杂模式)或者document.documentElement(标准模式)中的scrollLeft和scrollTop属性。

EventUtil.addHandler(document, "click", function(event) {event = EventUtil.getEvent(event);var pageX = event.pageX;var pageY = event.pageY;if(pageX === undefined) {pageX = event.clientX + (document.body.scrollLeft || document.documentElememt.scrollLeft);};if(pageY === undefined) {pageY = event.clientY + (document.body.scrollTop || document.documentElememt.scrollTop);};alert("鼠标指针页面坐标为:水平距离—" + pageX + ";" + "垂直距离—" + pageY);});

 

3、屏幕坐标位置

通过事件对象event的screenX和screenY属性,可以访问事件发生时鼠标指针在电脑屏幕中的水平和垂直坐标。

event_util.addHandler(document, "click", function(event) {event = event_util.getEvent(event);alert("鼠标指针屏幕坐标为:水平距离—" + event.screenX + ";" + "垂直距离—" + event.screenY);});

 

4、修改键

Shift、Ctrl、Alt、Meta这些修改键经常被用来修改鼠标事件的行为,DOM为此规定了4个属性,表示这些修改键的状态:shiftKey、ctrlKey、altKey、metaKey。这些属性中包含的都是布尔值,如果值为true,表示相应的键被按下,否则为false。当某个鼠标事件发生时,通过检测这4个属性,就能确定用户是否按下某个修改键。

var div = document.getElementById("myDiv");EventUtil.addHandler(div, "click", function(event){event = EventUtil.getEvent(event);var keys = new Array();//当属性值为true时,将对应修改键的名称田间到keys数组中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(","));});

 

5、相关元素

  • 对mouseover事件而言,事件的主目标就是获得光标的元素,而相关元素就是失去光标的那个元素;
  • 对mouseout事件而言,事件的主目标就是失去光标的元素,而相关元素就是获得光标的那个元素。

DOM通过event事件对象的relatedTarget属性提供了相关元素的信息,这个属性只对mouseover和mouseout事件才包含值;对于其他事件,其值为null

IE8及之前版本不支持relatedTarget属性,但提供相似的属性。在mouseover事件触发时,IE的fromElement属性中保存着相关元素;在mouseout事件触发时,IE的toElement属性中保存了相关元素
IE9支持所有的这些属性。
将跨浏览器取得相关元素的方法getRelatedTarge()添加到EventUtil对象中.

getRelatedTarget: 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;}
}

 

6、鼠标按钮

  只有在主鼠标按钮被单击(或键盘回车键被按下)时才会触发click事件,所以需要检测按钮的信息,对于mousedown和mouseup事件而言,在event事件对象中存在一个button属性,表示按下或释放的按钮。

DOM中的button属性可能有以下三个值:

  • 0,表示主鼠标按钮(鼠标左键);
  • 1,表示中间按钮;
  • 2,表示次鼠标按钮(鼠标右键)。

IE8及之前版本中,也提供button属性,但其属性值与DOM的不太通属性值有很大差别。

  • 0:没有按下鼠标按钮;
  • 1:主鼠标按钮;
  • 2:次鼠标按钮;
  • 3:同时按下主鼠标按钮和次鼠标按钮;
  • 4:中间鼠标按钮;
  • 5:同时按下主鼠标按钮和中间鼠标按钮;
  • 6:同时按下次鼠标按钮和中间鼠标按钮;
  • 7:同时按下三个鼠标按钮

EventUtil对象添加getButton()方法。

var EventUtil={
//省略其他代码
getButton: function(event) {if(document.implementation.hasFeature("MouseEvents", "2.0")) { //确定event对象中存在的button属性中是否包含正确的值return event.button;} else { //不包含正确的值,说明是ie,需要对相应的值进行规范化,将IE模型规范化为DOM方式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;}}
}
//省略其他代码
}

 

7、更多的事件信息

对于鼠标事件来说,detail属性中包含一个数值,表示在给定位置上发生多少次单击;在同一个位置上相继发生mousedown和mouseup事件算作一次单击。detail从1开始计数。如果鼠标在mousedown和mouseup事件之间移动了位置,则detail的值会被重置为0。

8、鼠标滚轮事件

当用户通过鼠标滚轮与页面交互、在垂直方向上滚动页面时,会触发mousewheel事件,该事件可以在任何元素上触发,最终会冒泡到document(IE8)或window(IE9、Opera、Chrome和Safari)对象。与mousewheel事件对应的event对象除了包含鼠标事件的所有标准信息之外,还包含一个特殊的wheelDelta属性;当用户向前滚动鼠标滚轮时,wheelDelta是120的倍数,当用户向后滚动鼠标滚轮时,wheelDelta是-120的倍数。
下述代码可以得到wheelDelta的值,但多数情况下,只需要知道滚动鼠标滚轮的方向,而这通过检测wheelDelta的正负号就可以确定。

EventUtil.addHandler(document, "mousewheel", function(event) {event = EventUtil.getEvent(event);alert(event.wheelDelta);});

 

注意:在Opera9.5及之前版本中,wheelDelta的正负号是颠倒的;可以使用浏览器检测技术来确定实际的值,如下:

EventUtil.addHandler(document, "mousewheel", function(event) {event &#61; EventUtil.getEvent(event);var delta &#61; (client.engine.opera && client.engine.opera <9.5 ? -event.wheelDelta : event.wheelDelta)alert(delta);
});

 

在Firefox浏览器中&#xff0c;支持一个名为DOMMouseScroll的事件&#xff0c;也是在鼠标滚轮滚动时触发&#xff0c;其被视为鼠标事件&#xff0c;包含与鼠标事件有关的所有信息&#xff1b;而有关鼠标滚轮的信息则保存在detail属性中&#xff0c;当向前滚动滚轮时&#xff0c;其值为-3的倍数&#xff0c;当向后滚动滚轮时&#xff0c;其值为3的倍数。
可以将DOMMouseScroll事件添加到页面中的任何元素&#xff0c;而且该事件会冒泡到window对象。所以可以像下面这样针对这个事件来添加事件处理程序&#xff1a;

EventUtil.addHandler(document, "DOMMouseScroll", function(event) {event &#61;EventUtil.getEvent(event);alert(event.detail);});

 

跨浏览器环境下的解决方案&#xff1a;

getWheelDelta: function(event) {if(event.wheelDelta) {return event.wheelDelta;} else {return -event.detail * 40;}
}

 

转:https://www.cnblogs.com/lmjZone/p/7738047.html



推荐阅读
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 在使用 iframe 嵌入外部页面时,经常会遇到页面加载不同步的问题。当嵌入的页面响应较慢时,这种异步加载会导致用户体验不佳。本文介绍了如何通过监听 iframe 加载完成的事件来解决这一问题,并提出了针对双滚动条问题的有效解决方案,以提升整体的用户体验和页面加载效率。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 出库管理 | 零件设计中的状态模式学习心得与应用分析
    出库管理 | 零件设计中的状态模式学习心得与应用分析 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
author-avatar
Cinderella
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有