blur事件与click事件冲突的解决办法

在处理表单登录的过程中,遇到了一个问题,当我们在输入框输入内容输入框获取到焦点时,输入框后面会出现一个图标删除已输入的内容,因此删除图标会绑定一个click事件,但是当我们点击图标的时候,也触发了input的blur事件,blur事件会让input失去焦点时隐藏删除的图标,并且blur事件先于图标的click事件执行,因此这时候点击图标并不会删除输入框已输入的内容,而是图标消失了,那么这个结果就不是我们想要的,那怎么解决这个问题呢?


我们先看下blur和click事件

blur事件:当元素失去焦点时触发blur事件;早前,blur 事件仅发生于表单元素上。在新浏览器中,该事件可用于任何元素,blur和focus事件不会冒泡,其他表单事件都可以。

click事件:当点击元素时触发click事件;所有元素都有此事件,会产生冒泡。

问题产生的原因:
这是因为blur事件比click事件先触发,而javascript为单线程,同一时间只能执行处理一个事件,所以当blur执行时,导致其后续click事件并不会执行

解决方法一:如果让click事件比blur事件先触发就没有问题了,因此可以给blur事件加定时器延迟触发
/*删除图标的点击事件*/
 $(".delete-icon").on("click",function () {
    $(this).prev("input").val("").focus();
 });
 /*输入框失去焦点的blur事件*/
 $("input[name='username'],input[name='password']").on("blur",function () {
    var $this = $(this);
    setTimeout(function(){
       $this.parent().removeClass("active");
       $this.next(".delete-icon").hide();
   },250)
});

缺点:设置多久的延时是一个难以两全的问题,时间太短不能保证click事件的100%触发,时间太长则会造成卡顿的感觉,影响用户体验

解决方法二:将click事件改为mousedown事件,mousedown事件是优先于blur事件执行
            /*删除图标的点击事件*/
            $(".delete-icon").on("mousedown",function () {
                $(this).prev("input").val("").focus();
            });
           /*输入框失去焦点的blur事件*/
            $("input[name='username'],input[name='password']").on("blur",function () {
                var $this = $(this);
                $this.parent().removeClass("active");
                $this.next(".delete-icon").hide();
            });

缺点:鼠标按下便触发了事件,不收起、长按也会触发,可能造成用户体验不好

解决方法三:给图标再添加一个mousedown事件,在其中执行event.preventDefault()阻止浏览器默认事件,这样点击按钮时输入框就不会失去焦点了
           /*阻止浏览器默认事件*/
            $(".delete-icon").on("mousedown",function(e) {
                e.preventDefault();
            })
            /*删除图标的点击事件*/
            $(".delete-icon").on("click",function () {
                $(this).prev("input").val("").focus();
            });
           /*输入框失去焦点的blur事件*/
            $("input[name='username'],input[name='password']").on("blur",function () {
                var $this = $(this);
                $this.parent().removeClass("active");
                $this.next(".delete-icon").hide();
            });
解决方法四:动态绑定blur事件,当鼠标进入input框父级元素时,移除input绑定事件blur,当鼠标移出输入框父级元素时,给input绑定blur事件
            /*动态绑定blur事件*/
            $(".login-con li").mouseenter(function(){
                $(this).find("input").unbind("blur");
            });
            $(".login-con li").mouseleave(function(event){
                $(this).find("input").bind("blur");
            });
           /*删除图标的点击事件*/
            $(".delete-icon").on("click",function () {
                $(this).prev("input").val("").focus();
            });
           /*输入框失去焦点的blur事件*/
            $("input[name='username'],input[name='password']").on("blur",function () {
                var $this = $(this);
                $this.parent().removeClass("active");
                $this.next(".delete-icon").hide();
            });

推荐使用方法三、方法四
原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe
95后前端妹子一枚,爱阅读,爱交友,将工作中遇到的问题记录在这里,希望给每一个看到的你能带来一点帮助。
欢迎留言交流

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,864评论 1 11
  • 本篇博客源地址 总结: 鼠标事件 1.click与dbclick事件ele.click()ele.click(ha...
    ZombieBrandg阅读 3,938评论 0 1
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 5,532评论 2 10
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 5,203评论 0 8
  • 第1章 鼠标事件 1-1 jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是...
    mo默22阅读 5,049评论 0 6