前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

鼠标事件

  鼠标事件共10类,包括click、contextmenu(右键)、dblclick(双击)、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter和mouseleave;

  页面上的所有元素都支持鼠标事件,除了 mouseenter 和 mouseleave 事件外,所有的鼠标事件都会冒泡;safari 浏览器不支持 mouseenter 和 mouseleave 事件;

顺序

  1. 鼠标移入某元素时,IE浏览器会先触发一次 mousemove 事件,再触发 mouseover 和 mouseenter 事件,再触发多次 mousemove 事件;而其他浏览器都是先触发 mouseover 和 mouseenter 事件,再触发多次 mousemove 事件;
  2. 鼠标移出某元素时,所有浏览器的顺序都是 mousemove、 mouseout 和 mouseleave 事件;
  3. 双击鼠标时,一般地,浏览器的顺序是(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;
  4. 点击鼠标右键时,一般地,浏览器的顺序是(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对信息;

  1. clientX/Y 表示鼠标指针在可视区域中的水平和垂直坐标;
  2. x/y 与 clientX/Y 相同,但有兼容问题。firefox 浏览器不支持 x/y,且IE7及以下浏览器把视口的左上角坐标设置为(2,2),其他浏览器则将(0,0)作为起点坐标,所以存在(2,2)的差距;一般不用这个;
  3. screenX/Y 表示鼠标指针相对于屏幕的水平和垂直坐标;
  4. pageX/Y 表示相对于页面的水平和垂直坐标,它与 clientX/clientY 的区别是不随滚动条的位置变化;
  5. layerX/Y 与 pageX/Y 相同;IE8及以下浏览器不支持 pageX/Y 和 layerX/Y,不过可以根据 scrollTop/Left 和 clientX/Y 计算出来;event.pageX = event.clientX + document.documentElement.scrollLeft;
  6. 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>

移动端事件

  由于移动设备没有鼠标,所以与电脑端有一些不同之处。移动设备尽量使用移动端事件,而不要使用鼠标事件;

  1. 不支持 dblclick 双击事件。在移动设备中双击浏览器窗口会放大画面;
  2. 单击元素会触发 mousemove 事件;
  3. 两个手指放在屏幕上且页面随手指移动而滚动时会触发 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 鼠标事件和键盘事件的更多相关文章

  1. 基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

    这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...

  2. 前端(十五)—— JavaScript事件:绑定事件方式、事件的冒泡和默认事件、鼠标事件、键盘事件、表单 事件、文档事件、图片事件、页面事件

    JS事件:绑定事件方式.事件的冒泡和默认事件.鼠标事件.键盘事件.表单 事件.文档事件.图片事件.页面事件 一.事件的两种绑定方式 1.on事件绑定方式 document.onclick = func ...

  3. Python_Selenium之basepage 识别元素、浏览器操作、获取属性、鼠标事件、键盘事件、弹窗、切换frame、切换句柄等封装

    #coding=gbkimport osimport timefrom selenium import webdriverfrom selenium.webdriver.common.by impor ...

  4. python+selenium三:鼠标事件与键盘事件

    1.鼠标事件:# 每个模拟事件后需加.perform() 才会执行# context_click() 右击# double_click() 双击# drag_and_drop(source, targ ...

  5. Selenium3 + Python3自动化测试系列四——鼠标事件和键盘事件

    一.鼠标事件 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供. ActionChains 类提供了鼠标操作的常用方法. ActionChains 类的成 ...

  6. lufylegend:文本、鼠标事件、键盘事件

    1.文本 <script type="text/javascript">init(50,"mylegend",500,350,main);funct ...

  7. jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)

    1.jQuery鼠标事件之click与dbclick事件   方法一:$ele.click()(不带参数)   <div id="test">点击触发<div&g ...

  8. JavaScript(js)处理的HTML事件、键盘事件、鼠标事件

    示例代码: HTML文件: <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...

  9. JavaFX桌面应用开发-鼠标事件和键盘事件

    鼠标相关事件的操作初始代码 package application; import javafx.application.Application;import javafx.event.ActionE ...

随机推荐

  1. java基础学习系列二

    循环语句 1,for(){} 2,while(){} 3,do{}while() continue和break用法 break是结束循环 continue结束本次循环

  2. 数据系统的未来------《Designing Data-Intensive Applications》读书笔记17

    终于来到这本书最后的一章了<Designing Data-Intensive Applications>大部头,这本书应该是我近两年读过最棒的技术书籍.作者Martin Kleppmann ...

  3. Algorithm --> 二分图最大匹配

     匈牙利算法 二分图:把一个图的顶点划分为两个不相交集 U  和 V ,使得每一条边都分别连接U . V  中的顶点.如果存在这样的划分,则此图为一个二分图. 匹配:在图论中,一个「匹配」(match ...

  4. Flashing Back a Failed Primary Database into a Physical Standby Database(闪回FAILOVER失败的物理备库)

    文档操作依据来自官方网址:https://docs.oracle.com/cd/E11882_01/server.112/e41134/scenarios.htm#SBYDB4888 闪回FAILOV ...

  5. sessionStorage和localStorage的用法,不同点和相同点

    一,共同点 (1)存储时用setItem: localStorage.setItem("key","value");//以"key"为名称存 ...

  6. 2018上c语言第0次作业

    随笔: 1.翻阅邹欣老师博客关于师生关系博客,并回答下列问题,每个问题的答案不少于500字: (1)最理想的师生关系是健身教练和学员的关系,在这种师生关系中你期望获得来自老师的哪些帮助? 答:对此问题 ...

  7. 操作 numpy 数组的常用函数

    操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...

  8. 201621123031 《Java程序设计》第1周学习总结

    作业01-Java基本概念 1.本周学习总结 1.本周学习内容:Java发展史(简述).Java语言特点.JDK .JRE .JVM .Java的开发步骤.Java开发工具. 2.关键概念之间的联系: ...

  9. Flask 扩展 Mail

    安装 pip install flask-mail from flask import Flask from flask_mail import Mail, Message app = Flask(_ ...

  10. MySql使用存储过程实现事务的提交或者回滚

    DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN ; ; START TRANS ...