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

4,311 阅读1分钟

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

我们先看下blur和click事件

blur事件:元素节点失去焦点后触发,该事件不会冒泡。

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

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

解决方法一 :给图标再添加一个mousedown事件,在其中执行event.preventDefault()阻止浏览器默认事件,这样点击按钮时输入框就不会失去焦点了
<span v-if="showClear" @click="clear" @mousedown.prevent>X</span>  
解决方法二:动态绑定blur事件,当鼠标进入input框父级元素时,移除input绑定事件blur,当鼠标移出输入框父级元素时,给input绑定blur事件
handleBlur(event) {
  if (this.hovering) return;
  this.focused = false;
  this.$emit('blur', event);
},

引用

www.jianshu.com/p/791b30924…