满口金牙 2022-05-24 19:53 采纳率: 91.1%
浏览 127
已结题

vue3 自制抽屉 Dom元素时一些疑问

目的,做 一个 点击弹出的 抽屉 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) // 关闭监听事件
    } 
  })


请教有没有更简便的方法. 达到点击 元素外面 ,隐藏元素自身的方法?
  • 写回答

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>
    
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月24日

悬赏问题

  • ¥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摄像头无法解绑使用,请教解绑当前账号绑定问题,