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 相关文章推荐
一步一步制作jquery插件Tabs实现过程
Jul 06 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
javascript中处理时间戳为日期格式的方法
Jan 02 Javascript
jquery获取radio值实例
Oct 16 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
js+css实现tab菜单切换效果的方法
Jan 20 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
JavaScript利用Date实现简单的倒计时实例
Jan 12 Javascript
vue中在vuex的actions中请求数据实例
Nov 08 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 Javascript
详解实现vue的数据响应式原理
Jan 20 Vue.js
完美解决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正则
2006/07/07 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
javascript 有用的脚本函数
2009/05/07 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
python中的tcp示例详解
2018/12/09 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
python join方法使用详解
2019/07/30 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
解释一下抽象方法和抽象类
2016/08/27 面试题
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
欠条范文
2015/07/03 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript