目的,做 一个 点击弹出的 抽屉 dom, 点击dom外面,该dom隐藏
下 面 代码错在哪?
const drawerVisible = ref<boolean>(false) // 控制抽屉 div 的显示
const refDrawer = ref<any>() // ref绑定了抽屉 div dom元素
// 点击显示 drawer, 注意:鼠标点击位置在 drawer元素外面, drawer点击前没有显示
function drawerPosition(){
if(!drawerVisible.value){
drawerVisible.value = true // 显示 drawer
document.addEventListener('click',eventInfo) // 开始监听鼠标点击位置,
}
}
function eventInfo(e:any){ // click 监听的回调
if(e.clientX < refDrawer.value.offsetLeft // 当鼠标点击在 drawer 元素外面时关闭 drawer
|| e.clientY < refDrawer.value.offsetTop
){
drawerVisible.value = false
}
}
// 关闭监听事件.
watch(()=> drawerVisible.value,(newValue)=>{ // 当 drawerVisible.value等于false时关闭监听
// 问题在这,发现每次点击, drawerVisible.value 变成 true 又马上变成 false
console.log('发生了变化',newValue) //
if(!newValue){
document.removeEventListener('click',eventInfo) // 关闭监听事件
}
})
请教有没有更简便的方法. 达到点击 元素外面 ,隐藏元素自身的方法?
vue3 自制抽屉 Dom元素时一些疑问
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- CSDN专家-showbo 2022-05-24 21:18关注
用事件对象的stopPropagation阻止冒泡执行document.onclick事件+dom元素contains判断下是否点击到弹出元素,示例代码如下
<div onclick='drawerPosition(event)'>Show</div> <div id="pop" style="display:none;width:100px;height:100px;background:#ccc;display:none"> <div>Sub div1</div> <div>Sub div2</div> <div>Sub div3</div> </div> <script> function drawerPosition(e) { pop.style.display = pop.style.display == 'block' ? 'none' : 'block';//切换 e.stopPropagation();//阻止冒泡执行document.onclick事件 } document.onclick = function (e) { var t = e.target;//获取点击的元素 if (t == pop || pop.contains(t)) return;//点击的元素是弹出层或者弹出层子元素,退出 pop.style.display = 'none'; } </script>
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥15 wegame打不开英雄联盟
- ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
- ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
- ¥30 eclipse开启服务后,网页无法打开
- ¥30 雷达辐射源信号参考模型
- ¥15 html+css+js如何实现这样子的效果?
- ¥15 STM32单片机自主设计
- ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
- ¥15 不小心不正规的开发公司导致不给我们y码,
- ¥15 我的代码无法在vc++中运行呀,错误很多