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

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日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog