一、问题描述
文本框的blur事件和div元素的click事件出现冲突。
在input的blur事件中,我们隐藏div元素。
在div的click事件中,我们清除input的内容,并隐藏自身。
当我们在input中输入内容后,点击div,希望触发div的click事件,清除input的内容,并隐藏自身。不料先触发了input的blur事件,隐藏了div元素,导致无法完成div的click事件。
二、问题分析
出现上述问题,让人不得不去探索事件执行顺序。
1、在一个input文本框中绑定如下事件,测试执行顺序

onmouseover,onmouseenter,(onmousemove)
onmousedown,onfocus,(onmousemove)
onmouseup,onclick,(onmousemove)
onkeydown,onkeypress,oninput,onkeyup,(onmousemove)
onmouseout,onmouseleave,onchange,onblur

2、在一个文本框和div标签中都绑定事件,测试执行顺序

【input】
onmouseover,onmouseenter,(onmousemove)
onmousedown,onfocus,(onmousemove)
onmouseup,onclick,(onmousemove)
onkeydown,onkeypress,oninput,onkeyup,(onmousemove)
onmouseout,onmouseleave,
【div】
onmouseover,onmouseenter,(onmousemove)
onmousedown
【input】
onchange,onblur
【div】
(onmousemove)
onmouseup,onclick,(onmousemove)
onmouseout,onmouseleave

3、mouseover和mouseenter的区别
不论鼠标指针穿过被选元素或其子元素,都会触发mouseover事件。
只有在鼠标指针穿过被选元素时,才会触发mouseenter事件。

4、mouseout和mouseleave的区别
mouseout事件会冒泡,子节点的mouseout事件会冒泡到父节点,进而触发父节点的mouseout事件。
mouseleave事件就没有这种效果,所以离开子节点时,不会触发父节点的监听函数。

三、解决方案
1、为blur添加延迟

dom_input.addEventListener('blur',function(e){
  setTimeout(function () {
    dom_div.style.display = "none";
  }, 200);
},true);

让div延时隐藏,可以解决div无法被点击的问题。但设置多久的延时是一个难以两全的问题,时间太短不能保证click事件的100%触发,时间太长则会造成卡顿的感觉,影响用户体验。因此,设置延时并不是该问题的最佳解决方案。

2、blur事件的动态绑定

//鼠标进入div区域,取消文本框的blur事件绑定
var fn = function(e){
  dom_div.style.display = "none";
}
dom_div.addEventListener('mouseenter',function(e){
  dom_input.removeEventListener("blur", fn, false);
},true);
//鼠标移出div区域,为文本框绑定blur事件
dom_div.addEventListener('mouseleave',function(e){
  dom_input.addEventListener("blur", fn, true);
},true);

3、mousedown代替click

dom_input.addEventListener('blur',function(e){
  dom_div.style.display = "none";
},true);

dom_div.addEventListener('mousedown',function(e){
  dom_input.value ='';
  dom_div.style.display = "none";
},true);

blur和click事件冲突的更多相关文章

  1. 下拉选择的blur和click事件冲突了

    当写个下拉选择框时我们希望当input失去焦点时,下拉框消失,或者当选择下拉框中的内容的同时将内容填入input并且使下拉框消失. 这时候我们会想到blur和click,单独使用的时候是没有问题的,但 ...

  2. jquery href属性和click事件冲突

    a标签的定义如下: <a href="javascript:void(0);">test</a> jquery中的click事件: $("a&qu ...

  3. js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法

    HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br ...

  4. onblur事件和click事件冲突

    在js中onblur事件的优先级click事件,所以同一个元素上绑定两个事件的时候,onblur事件会冲掉click事件. 解决方案:将click事件改成mousedown事件

  5. 移动端touch拖动事件和click事件冲突问题解决

    通过一个悬浮球交互功能的案例来阐述问题,以及解决办法. 实现效果 类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果 可以点击拖动,然后吸附在窗口边缘 点击悬浮球,可以跳转界面,或者更改悬浮球的形态 准 ...

  6. blur和click事件的先后顺序问题

    这两个同时用会有冲突.懒得翻译了,需要的自己看哈. 以下摘自stackoverflow. I have an input field, where I try to make autocomplete ...

  7. Vue--el-menu 的自动跳转功能与自己的click事件冲突

    一\先看elementUI说明 项目实际 此时点击活导航时以 index 作为 path 进行路由跳转 那么此时不要onclik事件了 如果此时有在有click 就

  8. HTML A标签 href click事件冲突

    转自:https://blog.csdn.net/xinglu/article/details/45199337

  9. 快速解决js开发下拉框中blur与click冲突

    在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦 ...

随机推荐

  1. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  2. angular的小实例

    主要是使用了angular的指令. 学习地址:http://www.runoob.com/angularjs/angularjs-tutorial.html 1. 效果: 输入数据剩余字数会相应减少, ...

  3. LFYZ-OJ ID: 1010 天使的起誓

    思路 理解题目后,会发现是一个高精度除低精度求余问题,非常简单. 容易出错的地方是:求余结果为0的时候,此时,天使所在的盘子号码其实就是n,如果直接返回余数,得到的结果则是0. 被除数的范围是2-10 ...

  4. keras系列︱Sequential与Model模型、keras基本结构功能(一)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72857454 中文文档:http://keras-cn.readthedocs.io/ ...

  5. -bash: Chmod: command not found

    是增加该文件的所有者拥有运行权限 如果所有者是root ,还要加sudo chmod u+x drlinuxclient.bin (sudo) chmod u+x drlinuxclient.bin ...

  6. 找不到或无法加载主类(Could not find or load main class)

    一般可能会是包名引起的,还有可能就不小心加上了.class后缀 解决方案如下 可以加上目录或者使用符号 . ,注意要用空格隔开 java -cp d:\sample HelloWorldjava -c ...

  7. java学习笔记01-环境配置

    需要先下载java的jdk,jdk是java的开发工具包,jre是java的运行环境,jdk里面都会带有jre的. 打开www.java.com,点击免费下载就行.之后默认安装就行了 1.设置JAVA ...

  8. udp/tcp流程

    udp: 1.创建套接字 socket 2.绑定本地ip/port bind 3.收发数据 sendto/recvfrom 4.关闭套接字 close tcp客户端: 1.创建套接字 socket 2 ...

  9. Flask+Nginx+Supervisor+Gunicorn+HTTPS部署教程(CentOs)

    写在前面 之前的文章中,我们详细讲述了怎样安装 Nginx,Python,Supervisor,Gunicorn,HTTPS.经本人多次测试是完全可以跑通的,那么本篇将介绍怎样将这些组合起来运行一个H ...

  10. MySQL批量更新字段url链接中的域名

    1. 首先进行数据库备份 2. SQL语句 UPDATE 表名 SET 字段 = REPLACE(字段, '待更新的内容','替换值'); eg: UPDATE 98k_images SET url ...