focus /focusin /focusout /blur 事件
事件触发时间
focus:当focusable元素获得焦点时,不支持冒泡;focusin:和focus一样,只是此事件支持冒泡;blur:当focusable元素失去焦点时,不支持冒泡;focusout:和blur一样,只是此事件支持冒泡;
以前一直以为所有事件都是支持冒泡的,都是可以cancel的,查阅了[MDN上相关资料](https://developer.mozilla.org/en-US/docs/Web/Events)后,才发现有些事件支持冒泡,有些事件并不支持冒泡;有些事件有默认行为(这类事件可以cancel),有些事件压根儿就没有默认行为(这类事件就不能 cancel )。从 MDN 上可以清楚的看到 focus和blur这2种事件不支持冒泡,支持冒泡的事件是focusin和focusout。
事件触发顺序
对于同时支持这4个事件的浏览器,事件执行顺序为focusin > focus > focusout > blur,代码示例如下:
|
1
2
3
4
|
<div class="parent"> <input type="text" /></div><div class="log"></div> |
javascript代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function log(str){ $('.log').append($('<div/>').text(str));}$('.parent') .focusin(function(){log('div focusin');}) .focusout(function(){log('div focusout');}) .focus(function(){log('div focus');}) .blur(function(){log('div blur');});$('input') .focusin(function(){log('input focusin');}) .focusout(function(){log('input focusout');}) .focus(function(){log('input focus');}) .blur(function(){log('input blur');}); |
执行结果
从执行结果可以看到4个事件的执行顺序,同时也可以看到 focus/blur是不支持冒泡的,所以.parent 元素绑定的focus和blur事件回调并没有触发。
focusin 与 focusout的浏览器支持
几乎所有的浏览器都支持focus和blur事件,但对于focusin和focusout 就不是这样理想了。Firefox中不支持focusin和focusout事件;chrome和safari中只有通过addEventListener方式绑定事件才能正常使用,其他方式绑定都不行;
面对这样的浏览器支持似乎很头痛,庆幸的是jQuery对focusin和focusout做了兼容,使用$.focusin和$.focusout实现事件绑定,在所有浏览器中都支持;
focus和blur如何实现事件代理
事件代理简单来说就是将子元素事件绑定在祖先元素上,之所以能够这样做,得益于标准事件模型的捕获和冒泡。我们知道在标准事件模型中,一个事件的触发会经历三个阶段:捕获阶段+目标阶段+冒泡阶段,有了捕获和冒泡才能实现事件代理。由前面介绍可知,focus和blur不支持冒泡,但其支持捕获,但 IE 中事件模型没有捕获只有冒泡,所以在非IE浏览器中可以通过在捕获阶段进行事件绑定实现事件代理。那么针对IE浏览器怎么实现呢?通过支持冒泡的是focusin和focusout实现就可以了。代码示例如下:
html 代码
|
1
2
3
4
|
<form name="form"> <input type="text" name="name" value="Your name"> <input type="text" name="surname" value="Your surname"></form> |
javascript 代码
|
1
2
3
4
5
6
7
8
9
|
function addColor(){ this.style.background="red";}var form = document.forms['form'];if (form.addEventListener) { // 非 IE 浏览器 form.addEventListener('focus', addColor, true);}else{ // IE form.onfocusin = addColor} |
哪些元素是focusable的
在本文的第一小节提到了一个 focusable 元素的概念,我觉得有必要在这里解释一下什么是focusable 元素。
默认情况下,只有部分html元素能获得鼠标焦点如input,很大一部分html元素是不能获得鼠标焦点的如div,这些能够获得鼠标焦点的元素就是focusable 元素。要想一个元素获得焦点,可以通过三种方式:
鼠标点击
tab 键
调用focus()方法
那么默认情况下,哪些元素是focusable 元素
window:当页面窗口从隐藏变成前置可见时,focus 事件就会触发
表单元素(form controllers):input/option/textarea/button
链接元素(links):a标签、area标签(必须要带 href 属性,包括 href 属性为空)
设置了 tabindex 属性(tabindex 值非-1)的元素
设置了contenteditable = "true"属性的元素
tabindex属性
默认情况下就能 focusable 的元素太少,如果想让一个 div 元素成为 focusable 的元素怎么做呢?很简单,设置 tabindex 属性即可!
tabindex 有2个作用:
使一个元素变成 focusable 只要在元素上设置了 tabindex 属性,不管此属性的值设为多少,此元素都将变成focusable元素。
定义多次按下 TAB 键时获得焦点的元素顺序tabindex 属性的值可以正数、0、负数,当多次按下TAB键,首先是tabindex为正数的元素获得焦点,顺序是:tabindex=1、tabindex=2、tabindex=3、tabindex=...,最后是tabindex=0的元素获得焦点。注意:tabindex为负数的元素不能通过 TAB 键获得焦点,只能通过鼠标点击或者调用focus()方法才能获得焦点。示例代码如下:

<ul>
<li tabindex="1" onfocus="showFocus(this)">One</li>
<li tabindex="0" onfocus="showFocus(this)">Zero</li>
<li tabindex="2" onfocus="showFocus(this)">Two</li>
<li tabindex="-1" onfocus="showFocus(this)">Minus one</li>
<li tabindex="-2" onfocus="showFocus(this)">Minus two</li>
</ul>
focus /focusin /focusout /blur 事件的更多相关文章
- 说说focus /focusin /focusout /blur 事件
事件触发时间 focus:当focusable元素获得焦点时,不支持冒泡:focusin:和focus一样,只是此事件支持冒泡:blur:当focusable元素失去焦点时,不支持冒泡:focusou ...
- jQuery - focusin/focusout/focus/blur事件的区别与不同
focus与blur事件:不支持冒泡 focusin与focusout:支持冒泡 事件触发顺序: 对于同时支持这4个事件的浏览器,事件执行顺序为focusin(聚焦) > focus > ...
- focus、blur事件的事件委托处理(兼容各个流浏览器)
今天工作中遇到个问题,问题是这样的,一个form表单中有比较多的input标签,因为form中的input标签中的值都需要前端做客户端校验,由于本人比较懒而且特不喜欢用循环给 每个input元素添加b ...
- jQuery 1.4版本的15个新功能(现在已经发布到jquery1.8,特别是增强版的live事件,支持 submit , change , focus 和 blur 事件)
1.jQuery()创建DOM元素:支持传参设置属性 之前,jQuery可以通过 attr 方法设置元素的属性,既可传属性的名和值,也可以是包含几组特定 属性名值对 的 对象.在 jQuery 1.4 ...
- 【五】jquery之事件(focus事件与blur事件)[提示语的出现及消失时机]
例题:当鼠标移动到某个文本框时,提示语消失. 当失去焦点时,如果该文本框有内容,保存内容.没有内容,则恢复最初的提示语句 <!DOCTYPE html> <html> < ...
- 【原】相煎何太急——input的blur事件与button的click事件
先来一段引子,最近在写手机h5页面,主要是一些登陆注册方面的,最绕不开的就是表单元素. 我想实现的是:在输入框后边有一个删除图标,当输入东西的时候触发事件,显示删除图标,点击该图标会删除之前输入的内容 ...
- div无法触发blur事件解决的方法
默认情况下div无法获取焦点,无法触发focus与blur事件,推測span,a等标签也无法触发焦点事件(input:button.及button标签能够触发) 怎样使div触发blur事件:能够给d ...
- blur事件
blur事件是在元素失去焦点的时候触发,那么失去焦点的前提便是获得焦点. 哪些元素可以获取焦点呢? 1.超链接 2.input button textarea (without disabled) 3 ...
- 下拉框click事件与搜索框blur事件的爱恨纠葛
还原车祸现场 功能类似于百度搜索,搜索框输入内容,下拉框显示候选项,点击候选项就选择候选项,然后下拉框隐藏,点击外面就直接隐藏下拉框,于是我写了以下代码 //参会单位联想 $('input[name= ...
随机推荐
- vue在element-ui的dialog弹出框中加入百度地图
参考:https://blog.csdn.net/u012724595/article/details/82703579 <!-- gps弹窗 --> <el-dialog v-di ...
- InnoDB global status
常见参数 Innodb_buffer_pool_pages_free 发现 Innodb_buffer_pool_pages_free 为0 ,则说明buffer_pool 已经被用光,需要增大 in ...
- 高德地图的权限Activity代码
/** * */package com.amap.location.demo; import java.lang.reflect.Method;import java.util.ArrayList;i ...
- Go: Println 与 Printf 的区别
Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法 2017-12-19 15:39:05 zgh0711 阅读数 26255更多 分类专栏: Go 版权声明 ...
- Java IO之处理流
一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性) ...
- CentOS7.6 部署asp.net core2.2 应用
1.安装.net Core SDK 在安装.NET之前,您需要注册Microsoft密钥,注册产品存储库并安装所需的依赖项.这只需要每台机器完成一次. 打开终端并运行以下命令: sudo rpm -U ...
- ajax 实战使用
注意ajax 必须放在script脚本中使用 ajax用于前端朝后端提交数据,并且后端函数处理好结果返回给success函数作为回调函数给前端,前端拿到后端传来的值,比如code==0 来做相应的前端 ...
- PHP ftp_exec() 函数
定义和用法 ftp_exec() 函数请求在 FTP 服务器上执行一个程序或命令. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_exec(ftp_connection ...
- apue 第18章 终端I/O
终端I/O有两种不同的工作模式: (1)规范模式:输入以行单位进行处理,每个读请求也最多返回一行. (2)非规范模式:输入字符不装配成行. 终端设备是由通常位于内核中的终端驱动程序控制的.每个终端设备 ...
- 炼数成金数据分析课程---10、python中如何画图
炼数成金数据分析课程---10.python中如何画图 一.总结 一句话总结: 主要matplotlib库,pandas中也可以画一些基础图 大纲+实例快速学习法 1.matplotlib的最简单画图 ...