el-drawer注册全局点击事件无效;el-dialog注册全局点击事件无效

提示:el-drawer或el-dialog注册全局点击事件无效,即抽屉或弹框外点击会触发事件,但抽屉和弹框内点击无反应

目前通过方案2:使用捕获阶段(推荐)解决


文章目录


这是因为 事件冒泡被阻止 了。el-drawer 组件内部的事件默认不会冒泡到 window,这可能是因为:

  1. el-drawer阻止了事件冒泡 (事件修饰符 .stop)
  2. 事件目标被判断为不在 window 内
  3. el-drawer的层叠上下文导致事件被拦截

解决方案

方案1:将事件监听器改为 document

javascript 复制代码
onMounted(() => {
  document.addEventListener("click", clearFlag)
})

onBeforeUnmount(() => {
  document.removeEventListener("click", clearFlag)
})

方案2:使用捕获阶段(推荐)

javascript 复制代码
onMounted(() => {
  document.addEventListener("click", clearFlag, true) // 第三个参数 true 表示捕获阶段
})

onBeforeUnmount(() => {
  document.removeEventListener("click", clearFlag, true)
})

方案3:检查事件路径

如果上面的方法无效,可以检查事件是否被阻止:

javascript 复制代码
const clearFlag = (event) => {
  console.log('事件触发', event.target)
  console.log('事件路径', event.composedPath())
  // 检查是否被阻止
  console.log('defaultPrevented', event.defaultPrevented)
}

方案4:针对 el-drawer 的特殊处理

javascript 复制代码
import { nextTick } from 'vue'

onMounted(() => {
  nextTick(() => {
    // 获取 drawer 的 DOM
    const drawer = document.querySelector('.el-drawer')
    if (drawer) {
      drawer.addEventListener('click', clearFlag)
    }
    
    // 同时监听 document 作为后备
    document.addEventListener('click', clearFlag)
  })
})

onBeforeUnmount(() => {
  const drawer = document.querySelector('.el-drawer')
  if (drawer) {
    drawer.removeEventListener('click', clearFlag)
  }
  document.removeEventListener('click', clearFlag)
})

方案5:使用 Vue 的自定义事件(如果 drawer 是子组件)

vue 复制代码
<!-- 父组件 -->
<template>
  <ChildDrawer @drawer-click="clearFlag" />
</template>

<!-- 子组件 drawer 内部 -->
<template>
  <el-drawer>
    <div @click="$emit('drawer-click')">
      <!-- 内容 -->
    </div>
  </el-drawer>
</template>

调试建议

javascript 复制代码
const clearFlag = (event) => {
  console.log('事件触发', {
    target: event.target,
    currentTarget: event.currentTarget,
    eventPhase: event.eventPhase, // 1: 捕获, 2: 目标, 3: 冒泡
    bubbles: event.bubbles, // 是否冒泡
    defaultPrevented: event.defaultPrevented,
    composed: event.composed, // 是否能跨越 Shadow DOM
  })
}

推荐先用方案1或方案2 ,大多数情况下将 window 改为 document 并使用捕获阶段就能解决问题。

相关推荐
福兮说5 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
专业程序开发源6 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源6 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
凤城老人6 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)6 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan7 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
星光开发者8 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
yivifu8 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
vx_Biye_Design9 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express