javascript基础学习系列四百五十二:焦点事件

焦点事件在页面元素获得或失去焦点时触发。这些事件可以与 document.hasFocus()和document.activeElement 一起为开发者提供用户在页面中导航的信息。焦点事件有以下 6 种。
 blur:当元素失去焦点时触发。这个事件不冒泡,所有浏览器都支持。
 DOMFocusIn:当元素获得焦点时触发。这个事件是 focus 的冒泡版。Opera 是唯一支持这个事件的主流浏览器。DOM3 Events 废弃了 DOMFocusIn,推荐 focusin。
 DOMFocusOut:当元素失去焦点时触发。这个事件是 blur 的通用版。Opera 是唯一支持这个事件的主流浏览器。DOM3 Events 废弃了 DOMFocusOut,推荐 focusout。
 focus:当元素获得焦点时触发。这个事件不冒泡,所有浏览器都支持。
 focusin:当元素获得焦点时触发。这个事件是 focus 的冒泡版。
 focusout:当元素失去焦点时触发。这个事件是 blur 的通用版。
焦点事件中的两个主要事件是 focus 和 blur,这两个事件在 JavaScript 早期就得到了浏览器支持。
它们最大的问题是不冒泡。这导致 IE后来又增加了 focusin 和 focusout,Opera又增加了 DOMFocusIn和 DOMFocusOut。IE 新增的这两个事件已经被 DOM3 Events 标准化。当焦点从页面中的一个元素移到另一个元素上时,会依次发生如下事件。
(1) focuscout 在失去焦点的元素上触发。
(2) focusin 在获得焦点的元素上触发。
(3) blur 在失去焦点的元素上触发。
(4) DOMFocusOut 在失去焦点的元素上触发。
(5) focus 在获得焦点的元素上触发。
(6) DOMFocusIn 在获得焦点的元素上触发。
其中,blur、DOMFocusOut 和 focusout 的事件目标是失去焦点的元素,而 focus、DOMFocusIn和 focusin 的事件目标是获得焦点的元素。
鼠标和滚轮事件
鼠标事件是 Web 开发中最常用的一组事件,这是因为鼠标是用户的主要定位设备。DOM3 Events定义了 9 种鼠标事件。
 click:在用户单击鼠标主键(通常是左键)或按键盘回车键时触发。这主要是基于无障碍的考虑,让键盘和鼠标都可以触发 onclick 事件处理程序。
 dblclick:在用户双击鼠标主键(通常是左键)时触发。这个事件不是在 DOM2 Events 中定义的,但得到了很好的支持,DOM3 Events 将其进行了标准化。
 mousedown:在用户按下任意鼠标键时触发。这个事件不能通过键盘触发。
 mouseenter:在用户把鼠标光标从元素外部移到元素内部时触发。这个事件不冒泡,也不会在
光标经过后代元素时触发。mouseenter 事件不是在 DOM2 Events 中定义的,而是 DOM3 Events
中新增的事件。
 mouseleave:在用户把鼠标光标从元素内部移到元素外部时触发。这个事件不冒泡,也不会在
光标经过后代元素时触发。mouseleave 事件不是在 DOM2 Events 中定义的,而是 DOM3 Events
中新增的事件。
 mousemove:在鼠标光标在元素上移动时反复触发。这个事件不能通过键盘触发。
 mouseout:在用户把鼠标光标从一个元素移到另一个元素上时触发。移到的元素可以是原始元
素的外部元素,也可以是原始元素的子元素。这个事件不能通过键盘触发。
 mouseover:在用户把鼠标光标从元素外部移到元素内部时触发。这个事件不能通过键盘触发。
 mouseup:在用户释放鼠标键时触发。这个事件不能通过键盘触发。
页面中的所有元素都支持鼠标事件。除了 mouseenter 和 mouseleave,所有鼠标事件都会冒泡,都可以被取消,而这会影响浏览器的默认行为。
由于事件之间存在关系,因此取消鼠标事件的默认行为也会影响其他事件。
比如,click 事件触发的前提是 mousedown 事件触发后,紧接着又在同一个元素上触发了 mouseup
事件。如果 mousedown 和 mouseup 中的任意一个事件被取消,那么 click 事件就不会触发。类似地,两次连续的 click 事件会导致 dblclick 事件触发。只要有任何逻辑阻止了这两个 click 事件发生(比如取消其中一个 click 事件或者取消 mousedown 或 mouseup 事件中的任一个),dblclick 事件就不会发生。这 4 个事件永远会按照如下顺序触发:

(2) mouseup
(3) click
(4) mousedown
(5) mouseup
(6) click
(7) dblclick

click 和 dblclick 在触发前都依赖其他事件触发,mousedown 和 mouseup 则不会受其他事件影响。
IE8 及更早版本的实现中有个问题,这会导致双击事件跳过第二次 mousedown 和 click 事件。相应的顺序变成了:

(2) mouseup
(3) click
(4) mouseup
(5) dblclick

鼠标事件在 DOM3 Events 中对应的类型是"MouseEvent",而不是"MouseEvents"。
鼠标事件还有一个名为滚轮事件的子类别。滚轮事件只有一个事件 mousewheel,反映的是鼠标滚轮或带滚轮的类似设备上滚轮的交互。
客户端坐标
鼠标事件都是在浏览器视口中的某个位置上发生的。这些信息被保存在 event 对象的 clientX 和clientY 属性中。这两个属性表示事件发生时鼠标光标在视口中的坐标,所有浏览器都支持。
可以通过下面的方式获取鼠标事件的客户端坐标:

div.addEventListener("click", (event) => { 
 console.log(`Client coordinates: ${event.clientX}, ${event.clientY}`); 
}); 

这个例子为

元素指定了一个 onclick 事件处理程序。当元素被点击时,会显示事件发生时鼠标光标在客户端视口中的坐标。注意客户端坐标不考虑页面滚动,因此这两个值并不代表鼠标在页面上的位置。
页面坐标
客户端坐标是事件发生时鼠标光标在客户端视口中的坐标,而页面坐标是事件发生时鼠标光标在页面上的坐标,通过 event 对象的 pageX 和 pageY 可以获取。这两个属性表示鼠标光标在页面上的位置,因此反映的是光标到页面而非视口左边与上边的距离。可以像下面这样取得鼠标事件的页面坐标:

div.addEventListener("click", (event) => { 
 console.log(`Page coordinates: ${event.pageX}, ${event.pageY}`); 
});

在页面没有滚动时,pageX 和 pageY 与 clientX 和 clientY 的值相同。
IE8 及更早版本没有在 event 对象上暴露页面坐标。不过,可以通过客户端坐标和滚动信息计算出来。滚动信息可以从 document.body(混杂模式)或 document.documentElement(标准模式)的scrollLeft 和 scrollTop 属性获取。计算过程如下所示:

div.addEventListener("click", (event) => { 
 let pageX = event.pageX, 
 pageY = event.pageY; 
 if (pageX === undefined) { 
 pageX = event.clientX + (document.body.scrollLeft || 
 document.documentElement.scrollLeft); 
 } 
 if (pageY === undefined) { 
 pageY = event.clientY + (document.body.scrollTop || 
 document.documentElement.scrollTop); 
 } 
 console.log(`Page coordinates: ${pageX}, ${pageY}`); 
});
  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值