一个下拉组件,如图,想要点击除这个组件的任何其他区域收起这个菜单,vue该怎么做?
1.弹出框v-if="isShow"判断
2.单击时@click="doClick()"
事件:默认(初始化)isShow为false,单击时isShow=!isShow
介绍:
obj为点击的下拉对象,对象里的childrenVisibility控制是否下拉
toggleDropDown(obj) {
// 切换下拉框状态
obj.childrenVisibility = !obj.childrenVisibility
// 如果已经下拉,注册全局点击收起事件
if (obj.childrenVisibility) {
// 生成随机的函数名,防止当有多个下拉框下拉时,第二个下拉框会给document注册同名函数,使得函数内部的obj变成模糊
let funcName = this.lodash.uniqueId('funcName_')
funcName = (e) => {
// 判断如果点击的不是下拉按钮时,就由事件收起下拉框,否则由下拉按钮收起,需要在下拉按钮中设置唯一标识"data-selfId",绑定下拉对象的id
if (!(e.target.getAttribute('data-selfId') == obj.id)) {
obj.childrenVisibility = false
}
}
// 注册监听事件,其中最后一个对象内的配置是必须的
document.addEventListener('click', funcName, {
once: true, // 控制监听事件只触发一次就自动删除
capture: true //, capture控制事件在捕获期间触发,因为根据浏览器捕获\冒泡的规则————先捕获,后冒泡,如果使它在冒泡阶段触发的话,点击打开下拉框后会马上注册事件,然后冒泡到document上,在第一轮就直接触发了,看上就跟打不开似的。
})
}
},
浏览器捕获冒泡与addeventlistener具体链接:
https://developer.mozilla.org...
https://zh.javascript.info/bu...
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
2 回答4.8k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
4 回答1.9k 阅读✓ 已解决