目的,做 一个 点击弹出的 抽屉 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无用
悬赏问题
- ¥50 adb连接不到手机是怎么回事?
- ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?
- ¥15 vs2022无法联网
- ¥15 TCP的客户端和服务器的互联
- ¥15 VB.NET操作免驱摄像头
- ¥15 笔记本上移动热点开关状态查询
- ¥85 类鸟群Boids——仿真鸟群避障的相关问题
- ¥15 CFEDEM自带算例错误,如何解决?
- ¥15 有没有会使用flac3d软件的家人
- ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,