其他元素的点击事件总是优先与blur事件触发
Demo预览:
https://sunzsh.github.io/vue-demos/#/autocomplete-tag-demo
代码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/components/Autocomplete2/index.vue
https://github.com/sunzsh/vue-el-demo/blob/master/src/views/autocomplete-tag-demo.vue
我们来看这个bug哈
这个标签可以自定义
比如输入点东西失去焦点他就上来了
还可以呢在下边选
但是呢注意看如果输入了点东西
并且我在下边选他就不行了
原因是什么呢
就是相比于下面的这个点击事件啊
这个文本框呢
失去焦点事件会优先被触发
所以呢
我们再点下边这个选项的时候啊
他认为是失去焦点了
这种问题呢通常我们有两个思路
第一个呢就是下边这个点击事件啊
我们把click改成mouse down
这样的话呢
mouse down
就会优先于这个blur事件去触发
但是呢由于我们用到的是这个
autocomplate所以它下边的这个弹出层啊
也不是我们自己写的
也是组件内部自带的
所以想把它改成mousedown比较麻烦
第二个思路呢
就是我们不用这个onblur事件了
我们用什么呢
大家记得我之前分享过
ElementUI里边有一个v-clickoutside吗
我们这样 v-clickoutside
然后把这个方法拿过来
但是啊
我们直接把它放在这个组件上用是
不行的原因是什么呢
原因是
虽然这个组件是我们自己封装的
但是他也是直接封装了autocomplate
autocompolate
它本身就有一个click outside
他们俩就冲突了
所以那怎么办呢
也很简单我们把这个click outside
在外边再封装一层
比如我们用span来封装一层
我们写到这里边
然后呢注意这有个v-if
我们也拿到这里边
因为下边有v-else
所以把它到这
放到这里边
同时注意啊
我们这里边一定要有这个
popper-append-to-body
等于false
否则的话呢
它弹出来的这个层它是在body里边
我们在这里边点击选项啊
他也会认为我们点击了
这个Spa标签以外的内容
这样就跟刚才那blur没什么区别了
所以一定要加上这个append-to-body=false
这样的话呢我们再来试一下刷新一下
先选中没问题
自己输入也没问题
然后我们再输入选择!大家看 也可以了
最后更新于
这有帮助吗?