focus
当 focusable 元素获得焦点时会触发该事件,不支持冒泡(不完全对)。
focusin
当 focusable 元素即将获得焦点时会触发该事件,和focus
一样,只是focusin
支持冒泡。
blur
当 focusable 元素失去焦点时会触发该事件,不支持冒泡(不完全对)。
focusout
当 focusable 元素即将失去焦点时会触发该事件,和blur
一样,只是focusout
支持冒泡。
注意:在focusable元素的focus
和blur
两个事件会冒泡到父级元素,但是不会继续向上冒泡。
//通用
element.onfocus = function(){//some code}
element.onblur = function(){//some code}
element.onfocusin = function(){//some code}
element.onfocusout = function(){//some code}
//IE9+
element.addEventListener("focus",function(){//some code})
element.addEventListener("blur",function(){//some code})
element.addEventListener("focusin",function(){//some code})
element.addEventListener("focusout",function(){//some code})
//html
<div id="box">
<h1>focus、blur、focusin、focusouth1>
<div id="iptWrapper">
<input type="text" id="ipt" placeholder="test"/>
div>
div>
//javascript
var ipt = document.getElementById("ipt"),
iptWrapper = document.getElementById("ipt"),
box = document.getElementById("box");
ipt.onfocus = function () {
console.log("onfocus");
}
ipt.onblur = function () {
console.log("onblur");
}
ipt.onfocusin = function () {
console.log("onfocusin");
}
ipt.onfocusout = function () {
console.log("onfocusout");
}
ipt.addEventListener &&
ipt.addEventListener("focusin",function () {
console.log("addEventListener-focusin");
})
ipt.addEventListener &&
ipt.addEventListener("focusout",function () {
console.log("addEventListener-focusout");
})
iptWrapper.onfocus = function () {
console.log("onfocus-iptWrapper");
}
iptWrapper.onblur = function () {
console.log("onblur-iptWrapper");
}
iptWrapper.addEventListener &&
iptWrapper.addEventListener("focusin",function () {
console.log("addEventListener-focusin-iptWrapper");
})
iptWrapper.addEventListener &&
iptWrapper.addEventListener("focusout",function () {
console.log("addEventListener-focusout-iptWrapper");
})
测试结果分析:
addEventListener
进行绑定focusin
、focusout
事件。focusin
->focus
->focusout
->blur
,其他浏览器则是focus
->focusin
->blur
->focusout
focus
和blur
事件之后,window也绑定focus
和blur
事件,则document.body无法监听focus
和blur
事件,反之亦然。但是对focusin
和focusout
无影响。focus
和blur
事件之后,其父级元素也绑定focus
和blur
事件,则focusable元素无法监听focus
和blur
事件,反之亦然。但是对focusin
和focusout
无影响。PS:其他浏览器指的是除微软家的IE和Edge外的主流浏览器。
特征 | Chrome | Firefox | Safari | Edge | IE | Opera |
---|---|---|---|---|---|---|
基本支持 | yes | yes | yes | yes | yes | yes |
PS:浏览器表现差异见上文
默认情况下,只有部分html元素能获得鼠标焦点如input
,很大一部分html元素是不能获得鼠标焦点的如div
,这些能够获得鼠标焦点的元素就是focusable 元素。要想一个元素获得焦点,可以通过三种方式:
那么默认情况下,哪些元素是focusable 元素
PS:用户通常可以使用tab键移动焦点,使用空格键激活焦点。比如,如果焦点在一个链接上,此时按一下空格键,就会跳转到该链接
tabindex
属性默认情况下就能 focusable 的元素太少,如果想让一个 div
元素成为 focusable 的元素怎么做呢?很简单,设置 tabindex 属性即可!
tabindex 有2个作用:
<ul>
<li tabindex="1">1li>
<li tabindex="0">0li>
<li tabindex="2">2li>
<li tabindex="-1" id="minusOne">-1li>
<li tabindex="-2" id="minusTwo">-2li>
ul>
//使用Tab键时,li元素获得焦点的顺序是1、2、0
//tabindex为负数的元素可以调用focus()获取焦点
var minusOne = document.getElementById("minusOne");
minusOne.onclick = function(){
minusOne.focus();
}
返回当前页面中获得焦点的元素,也就是说,如果此时用户按下了键盘上某个键,会在该元素上触发键盘事件.该属性是只读的.
input
或者textarea
元素,于此同时,如果用户在文本输入框中选中了一些文本,还可以使用该元素的selectionStart
和selectionEnd
属性获得准确的选中文本内容.select
(下拉菜单)或者type
属性为button
,checkbox
或radio
的input
元素.body
元素. <head>
<script>
console.log(document.activeElement);//null
script>
head>
<body>
<script>
console.log(document.activeElement);//
script>
body>
Document.hasFocus()
方法返回一个布尔值,表明当前文档或者当前文档内的节点是否获得了焦点。该方法可以用来判断当前文档中的活动元素是否获得了焦点。
true
,否则返回false
。if (document.hasFocus()) {
console.log("该页面获得了焦点.");
//some
}
else {
console.log("该页面没有获得焦点.");
}
https://www.cnblogs.com/RuMengkai/p/6230917.html
https://www.cnblogs.com/xiaohuochai/p/5874447.html