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 相关文章推荐
简单的js表单验证函数
Oct 28 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
Jul 28 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
Aug 24 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
Sep 05 Javascript
D3.js实现文本的换行详解
Oct 14 Javascript
js 用于检测类数组对象的函数方法
May 02 Javascript
Js面试算法详解
Apr 08 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
Aug 03 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
javascript实现京东快递单号的查询效果
Nov 30 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
用PHP+MySql编写聊天室
2006/10/09 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
详解Python中DOM方法的动态性
2015/04/11 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
个人授权委托书
2014/04/03 职场文书
文明村镇申报材料
2014/05/06 职场文书
写得不错的求职信范文
2014/07/11 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫