jacascript 鼠标事件和键盘事件
前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!
鼠标事件
鼠标事件共10类,包括click、contextmenu(右键)、dblclick(双击)、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter和mouseleave;
页面上的所有元素都支持鼠标事件,除了 mouseenter 和 mouseleave 事件外,所有的鼠标事件都会冒泡;safari 浏览器不支持 mouseenter 和 mouseleave 事件;
顺序
- 鼠标移入某元素时,IE浏览器会先触发一次 mousemove 事件,再触发 mouseover 和 mouseenter 事件,再触发多次 mousemove 事件;而其他浏览器都是先触发 mouseover 和 mouseenter 事件,再触发多次 mousemove 事件;
- 鼠标移出某元素时,所有浏览器的顺序都是 mousemove、 mouseout 和 mouseleave 事件;
- 双击鼠标时,一般地,浏览器的顺序是(1)mousedown、(2)mouseup、(3)click、(4)mousedown、(5)mouseup、(6)click、(7)dblclick;但 IE8及以下浏览器有一个小bug,在双击事件中,它会跳过第二个 mousedown 和 click 事件,顺序为(1)mousedown、(2)mouseup、(3)click、(4)mouseup、(5)dblclick;
- 点击鼠标右键时,一般地,浏览器的顺序是(1)mousedown、(2)mouseup、(3)contextmenu;但 safari 浏览器有一个小bug,它不触发 mouseup 事件,顺序为(1)mousedown、(2)contextmenu
鼠标位置
关于鼠标坐标位置,事件对象提供了 clientX/Y、x/y、pageX/Y、screenX/Y、offsetX/Y、layerX/Y 这6对信息;
- clientX/Y 表示鼠标指针在可视区域中的水平和垂直坐标;
- x/y 与 clientX/Y 相同,但有兼容问题。firefox 浏览器不支持 x/y,且IE7及以下浏览器把视口的左上角坐标设置为(2,2),其他浏览器则将(0,0)作为起点坐标,所以存在(2,2)的差距;一般不用这个;
- screenX/Y 表示鼠标指针相对于屏幕的水平和垂直坐标;
- pageX/Y 表示相对于页面的水平和垂直坐标,它与 clientX/clientY 的区别是不随滚动条的位置变化;
- layerX/Y 与 pageX/Y 相同;IE8及以下浏览器不支持 pageX/Y 和 layerX/Y,不过可以根据 scrollTop/Left 和 clientX/Y 计算出来;event.pageX = event.clientX + document.documentElement.scrollLeft;
- offsetX/Y 表示相对于定位父级的水平和垂直坐标;当页面无定位元素时,body 是元素的定位父级。由于 body 的默认margin是8px,所以 offsetX/Y 与 clientX/Y 差(8,8);
键位鼠标组合
虽然鼠标事件主要是使用鼠标来触发的,但在按下鼠标时键盘上的某些键的状态也可以影响到所要采取的操作
这些修改键就是Shift、Ctrl、Alt和Meta(在Windows键盘中是Windows键,在苹果机中是Cmd键),它们经常被用来修改鼠标事件的行为
DOM为此规定了4个属性,表示这些修改键的状态:shiftKey、ctrlKey、altKey 和 metaKey。这些属性中包含的都是布尔值,如果相应的键被按下了,则值为true;否则值为false;IE8及以下浏览器不支持 metaKey 属性;
相关元素
target 属性返回事件的目标节点;relatedTarget 属性返回事件的次要相关节点。对于那些没有次要相关节点的事件,该属性返回null;
对 mouseover 事件而言,事件的主目标 target 是获得光标的元素,而相关元素 relatedTarget 就是那个失去光标的元素;
IE8及以下浏览器不支持 target 和 relatedTarget 属性,target 可以用 srcElement 属性兼容,relatedTarget 可以用 toElement 属性兼容;
鼠标按键
button 和 buttons 属性返回事件鼠标按键信息;
button 属性返回一个数值,表示按下了鼠标哪个键:
- -1 表示没有按下按键
- 0 表示按下左键
- 1 表示按下滚轮
- 2 表示按下右键
buttons 属性返回一个3个比特位的值,表示同时按下了哪些键。它用来处理同时按下多个鼠标键的情况;safari 浏览器不支持buttons属性;
- 001 按下鼠标左键
- 010 按下鼠标右键
- 100 按下滚轮
所以,同时按下左键和右键,buttons的二进制为011,表示3;同时按下左键和滚轮,buttons的二进制为101,表示5;同时按下右键和滚轮,buttons的二进制为110,表示6。
滚轮事件
滚轮事件与滚动事件不同,滚动事件必须有滚动条,才可以实现。而滚动事件是滚动鼠标滚轮触发的事件,与是否有滚动条无关;
IE6首先实现了鼠标滚轮 mousewheel 事件,当用户通过滚动与页面交互、在垂直方向上滚动页面时,会触发 mousewheel 事件。最终会冒泡到 document(IE8-)或window(标准);
firefox 浏览器不支持 mousewheel 事件,它支持 DOMMouseScroll 事件(该事件仅支持DOM2级事件处理程序的写法),而有关鼠标滚轮的信息则保存在 detail 属性中。当向前滚动鼠标滚轮时,这个属性的值是 -3 的倍数;当向后滚动鼠标滚轮时,这个属性的值是 3 的倍数。
滚轮事件中有一个 wheelDelta 属性,当用户向前滚动鼠标滚轮时,wheelDelta 是120的倍数;当用户向后滚动鼠标滚轮时,wheelDelta 是 -120 的倍数;
<script>
var scrollFunc = function (e) {
var direct = 0;
e = e || window.event;
//滚轮事件中有一个 wheelDelta 属性,当用户向前滚动鼠标滚轮时,wheelDelta 是120的倍数;当用户向后滚动鼠标滚轮时,wheelDelta 是 -120 的倍数;
//firefox 浏览器有关鼠标滚轮的信息则保存在 detail 属性中。当向前滚动鼠标滚轮时,这个属性的值是 -3 的倍数;当向后滚动鼠标滚轮时,这个属性的值是 3 的倍数。
if (e.wheelDelta > 0 || e.detail< 0) {
console.log("滑轮向上滚动");
}
if (e.wheelDelta < 0 || e.detail> 0) {
console.log("滑轮向下滚动");
}
}
//firefox 浏览器不支持 mousewheel 事件,它支持 DOMMouseScroll 事件(该事件仅支持DOM2级事件处理程序的写法)
if (document.addEventListener) {
document.addEventListener('DOMMouseScroll', scrollFunc, false);
}
//滚动滑轮触发scrollFunc方法
window.onmousewheel = document.onmousewheel = scrollFunc;
</script>
移动端事件
由于移动设备没有鼠标,所以与电脑端有一些不同之处。移动设备尽量使用移动端事件,而不要使用鼠标事件;
- 不支持 dblclick 双击事件。在移动设备中双击浏览器窗口会放大画面;
- 单击元素会触发 mousemove 事件;
- 两个手指放在屏幕上且页面随手指移动而滚动时会触发 mousewheel 和 scroll 事件;
键盘事件
键盘事件用来描述键盘行为,主要有 keydown、keypress、keyup 三个事件;
键盘事件必须绑定在可以获得焦点的元素上。而页面刚加载完成时,焦点处于document元素;
当用户按下键盘上的任意键时触发 keydown,如果按住不放的话,会重复触发该事件;
当用户按下键盘上的字符键时触发 keypress,按下功能键时不触发。如果按住不放的话,会重复触发该事件;
关于 esc 键,各浏览器处理不一致。IE浏览器和 firefox 浏览器按下 esc 键时,会触发 keypress 事件;而 chrome/safari/opera 这三个 webkit 内核的浏览器则不会触发;
IE浏览器不完全支持绑定在 document 元素上的 keypress 事件,只有 IE9及以上浏览器在使用DOM2级事件处理程序时才支持;
当用户释放键盘上的键时触发 keyup 事件;
系统为了防止按键误被连续按下,所以在第一次触发 keydown 事件后,有500ms的延迟,才会触发第二次 keydown 事件;类似的,keypress 事件也存在500ms的时间间隔;
如果按键按下后一直不松开,就会连续触发键盘事件,触发的顺序如下:keydown---keypress---keydown---keypress---重复这一过程---keyup;
按键信息
键盘事件包括 keyCode、key、char、keyIdentifier 和修改键共5个按键信息;
在发生键盘事件时,event 事件对象的键码 keyCode 属性中会包含一个代码,与键盘上一个特定的键对应。对数字字母字符键,keyCode 属性的值与 ASCII 码中对应大写字母或数字的编码相同;
firfox 浏览器不支持 keypress 事件中的 keyCode 属性;但是我们可以用 event.which 代替;
keyCode 属性无法区分大小写字母;
<input id="btn" type="text">
<script type="text/javascript">
btn.onkeydown = function(e){
e = e || event;
var x = e.which || e.keyCode;
if (x == 13) {
alert ("你按下了 enter 键!");
}
};
</script>
key 属性是为了取代 keyCode 而新增的,它的值是一个字符串。在按下某个字符键时,key 的值就是相应的文本字符;在按下非字符键时,key 的值是相应键的名,默认为空字符串;IE8及以下浏览器不支持,而 safari 浏览器不支持 keypress 事件中的 key 属性;
key 可以区分大小写;
<input id="btn" type="text">
<script type="text/javascript">
btn.onkeydown = function(e){
e = e || event;
var x = e.key;
if (x == 'Enter') {
alert ("你按下了 enter 键!");
}
};
</script>
char 属性在按下字符键时的行为与 key 相同,但在按下非字符键时值为null ;该属性只有IE9及以上浏览器支持;
keyIdentifier 属性在按下非字符键的情况下与 key 的值相同。对于字符键,keyIdentifier 返回一个格式类似 "U+0000" 的字符串,表示 Unicode 值;该属性只有chrome/safari/opera浏览器支持 ;
修改键在鼠标事件中介绍过,在键盘事件中也存在修改键;
修改键就是 Shift、Ctrl、Alt和Meta(在Windows键盘中是Windows键,在苹果机中是Cmd键)。DOM为此规定了4个属性,表示这些修改键的状态:shiftKey、ctrlKey、altKey和metaKey。这些属性中包含的都是布尔值,如果相应的键被按下了,则值为true;否则值为false;
提示大写
大写有两种实现方式:一种是在capslock开启的情况下,另一种是输入字符时,同时按下shift键;
<input id="test">
<span id="tips"></span>
<script>
var oTest = document.getElementById('test');
var oTips = document.getElementById('tips');
oTest.onkeydown = function(e){
e = e || event;
var lShiftKey = e.shiftKey;
//通过定时器延迟来获取当前输入字符值
setTimeout(function(){
var value = oTest.value.slice(-1);
//如果没有按下shift键,并且当前为大写字母,或者按下shift键,且当前为小写字母
if(!lShiftKey && /[A-Z]/.test(value) || lShiftKey && /[a-z]/.test(value)){
oTips.innerHTML = '当前为大写模式';
setTimeout(function(){
oTips.innerHTML = '';
},400)
}
})
}
</script>
jacascript 鼠标事件和键盘事件的更多相关文章
- 基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件
这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...
- 前端(十五)—— JavaScript事件:绑定事件方式、事件的冒泡和默认事件、鼠标事件、键盘事件、表单 事件、文档事件、图片事件、页面事件
JS事件:绑定事件方式.事件的冒泡和默认事件.鼠标事件.键盘事件.表单 事件.文档事件.图片事件.页面事件 一.事件的两种绑定方式 1.on事件绑定方式 document.onclick = func ...
- Python_Selenium之basepage 识别元素、浏览器操作、获取属性、鼠标事件、键盘事件、弹窗、切换frame、切换句柄等封装
#coding=gbkimport osimport timefrom selenium import webdriverfrom selenium.webdriver.common.by impor ...
- python+selenium三:鼠标事件与键盘事件
1.鼠标事件:# 每个模拟事件后需加.perform() 才会执行# context_click() 右击# double_click() 双击# drag_and_drop(source, targ ...
- Selenium3 + Python3自动化测试系列四——鼠标事件和键盘事件
一.鼠标事件 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供. ActionChains 类提供了鼠标操作的常用方法. ActionChains 类的成 ...
- lufylegend:文本、鼠标事件、键盘事件
1.文本 <script type="text/javascript">init(50,"mylegend",500,350,main);funct ...
- jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)
1.jQuery鼠标事件之click与dbclick事件 方法一:$ele.click()(不带参数) <div id="test">点击触发<div&g ...
- JavaScript(js)处理的HTML事件、键盘事件、鼠标事件
示例代码: HTML文件: <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...
- JavaFX桌面应用开发-鼠标事件和键盘事件
鼠标相关事件的操作初始代码 package application; import javafx.application.Application;import javafx.event.ActionE ...
随机推荐
- spring boot 启动问题
spring boot启动报错误 Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.co ...
- 【XML】 XML格式一些记录
XML XML格式常用于网络通讯,本身不会有作为而是作为纯文本传输,可以说它是一种独立于应用和硬件的数据传输工具.虽然看起来XML比HTML要更加简单,也知道的更加晚一点,但是需要知道的是,XML才是 ...
- 如何解决js递归里面出现的堆栈溢出
16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出.在保留递归模式的基础上,你怎么解决这个问题? var list = readHugeList(); var nextListItem = fu ...
- 自动化制作.framework
1.生成.framework前的配置工作详见:http://www.cnblogs.com/huangzs/p/8029258.html 2. 将以下脚本粘贴进去,修改FMK_NAME. p.p1 { ...
- 强烈推荐!!!Fiddler抓取https设置详解(图文)
很多实用fiddler抓包,对于http来说不需太多纠结,随便设置下就能用,但是抓取https就死活抓不了, 诸如以下问题: creation of the root certificate was ...
- JavaWeb学习笔记五 会话技术Cookie&Session
什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...
- Spring之事务管理的好处
在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中.Spring容器集成了TransactionTemplate,封装了所有对事务处理的功能 ...
- alpha冲刺第十天
一.合照 二.项目燃尽图 三.项目进展 之前卡住的注册无法插入数据的问题解决 可以呈现多条数据内容了,首页文章内容呈现,问答界面问题内容呈现 四.明日规划 很多没有完善的,后面还是要继续整改 五.问题 ...
- 团队作业4——第一次项目冲刺(Alpha版本)
第一天http://www.cnblogs.com/ThinkAlone/p/7861070.html 第二天http://www.cnblogs.com/ThinkAlone/p/7861191.h ...
- 项目Beta冲刺Day5
项目进展 李明皇 今天解决的进度 服务器端还未完善,所以无法进行联动调试.对页面样式和逻辑进行优化 明天安排 前后端联动调试 林翔 今天解决的进度 完成维护登录态,实现图片上传,微信开发工具上传图片不 ...