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

鼠标事件

  鼠标事件共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. 笔记:Maven 项目目录结构

    Maven提倡使用一个共同的标准目录结构,使开发人员能在熟悉了一个Maven工程后,对其他的Maven工程也能清晰了解.这样做也省去了很多设置的麻烦,以下的文档介绍是Maven希望的目录结构,并且也是 ...

  2. Django+xadmin打造在线教育平台(七)

    十.授课教师 10.1.讲师列表页 拷贝teacher-list.html和teacher-detail.html到templates目录下 先改teacher-list.html,同样继承base. ...

  3. apache学习教程

    5.apache教程 httpd.conf文件分析 ServerRoot "E:/phpwebenv/PHPTutorial/Apache" #apache软件安装的位置 List ...

  4. windows下apache报os 10048错误

    在apache的bin目录下运行httpd -k install,报错os10048 (错误信息是跟443端口有关),网上的答案说的是改掉httpd.conf里的默认端口或者关闭占用端口的进程,默认端 ...

  5. 第一次作业:来自一个奋斗的IT学子

    第一部分 结缘计算机 1.1你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 说起为何结缘了计算机,就得谈谈专业报考了,我觉得我的报考真是一个反面教科书了.由于高中以前每天只要想着 ...

  6. C语言的第一次博客作业

    题目1:7-3 温度转换 1.代码 int fahr, celsius; fahr=150; celsius=5*(fahr-32)/9; printf("fahr = %d, celsiu ...

  7. C语言第三次博客作业—循环结构

    一.PTA实验作业 题目1 1.实验代码 int N,i; //N为用户数 char sex; //sex表示性别 double High; //Hight表示身高 scanf("%d&qu ...

  8. c/cpp语言链表连接部分详解

    核心代码: ①pTail->next = pNew; ②pNew->next = NULL; ③pTail = pNew; 设结构体名称为 struct ST: 注:方框代表分配的内存空间 ...

  9. LR回放https协议脚本失败: 错误 -27778: 在尝试与主机“www.baidu.com”connect 时发生 SSL 协议错误

    今天用LR录制脚本协议为https协议,回放脚本时出现报错: Action.c(14): 错误 -27778: 在尝试与主机"www.baidu.com"connect 时发生 S ...

  10. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...