Javascript中click与blur事件的顺序详析


Posted in Javascript onApril 25, 2017

一、现象

最近在开发中碰到了一个需求,具体需求如下图。

Javascript中click与blur事件的顺序详析

这是一个很常见的需求,input框负责在点击回车和失焦的时候确认输入。button负责清除输入,input绑定代码为:

input.addEventListener('blur',function(){
 console.log('input blur');
});
input.addEventListener('keyup',function(){
 console.log('input keyup');
});

"X"绑定的代码为:

button.addEventListener('click', function(e){
 console.log('button click');
});

尝试着执行代码,并按照先输入再点击按钮取消的操作,结果如下:

Javascript中click与blur事件的顺序详析

可以看到,input blur在button的click之前触发了,这就导致取消操作其实并没有起到作用。

同时,也能发现事件的执行顺序为(input-blur) -> (button-click);

二、解决方案1

最简单的解决方案为:将button的时间换成onmousedown事件,可以得到如下结果:

Javascript中click与blur事件的顺序详析

事件顺序正确了,但是这种解决方式有两个问题:

     a)无法在按下按钮后取消点击

     b)控制blur是否执行,需要额外的代码

那么有木有进一步解决方案呢?

三、解决方案2

对button同时绑定mousedown和blur事件即可,具体代码和执行结果如下:

button.addEventListener('mousedown', function(e){
 console.log('button mousedown');
 e.preventDefault();
});
button.addEventListener('click', function(e){
 console.log('button click');
 input.blur();
});

Javascript中click与blur事件的顺序详析

这样的方式,就克服了第一种方案的两个弊端,也完美的解决了需求。

四、执行顺序探秘

查询w3c标准后,没有发现关于blur和mousedown,click的顺序说明。根据猜测,blur需要mousedown执行默认事件来触发。所以总结事件顺序应为:mousedown->(other)blur->mouseup->click

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
Nov 15 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
Dec 13 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
jQuery中clone()方法用法实例
Jan 16 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
Aug 18 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
Apr 25 #Javascript
ES6中Math对象新增的方法实例详解
Apr 25 #Javascript
jquery.form.js异步提交表单详解
Apr 25 #jQuery
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 #jQuery
深入理解Javascript中的作用域链和闭包
Apr 25 #Javascript
js中字符型和数值型数字的互相转化方法(必看)
Apr 25 #Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 #Javascript
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
javascript常用函数(1)
2015/11/04 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python随机生成手机号、数字的方法详解
2017/07/21 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
车间安全生产标语
2014/06/06 职场文书
临床专业自荐信
2014/06/22 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
小人国观后感
2015/06/11 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
基于Redission的分布式锁实战
2022/08/14 Redis