Vuejs2 在Vue组件中使用DomeElement.addEventListener正在捕获前面的事件

Vuejs2 在Vue组件中使用DomeElement.addEventListener正在捕获前面的事件,vuejs2,addeventlistener,Vuejs2,Addeventlistener,我有一个Vue组件,它在其创建的生命周期方法中向文档添加一个事件侦听器,以捕获root$el之外的任何单击。让我们称之为弹出窗口 当我单击调用并装载上述弹出窗口的元素时,会立即捕获文档单击事件 下面是一个JSFIDLE,其中包含简化的代码: 与此相反,这里是一个纯js版本,它可以正确绑定click事件: 作为交叉参考,以下是vue论坛帖子: 任何见解都值得赞赏 归功于Vue核心团队成员LinusBorg 需要设置超时时间 下面是一个实现了setTimeout的工作示例: 英文解释: 单击事件发

我有一个
Vue
组件,它在其
创建的
生命周期方法中向文档添加一个事件侦听器,以捕获root
$el
之外的任何单击。让我们称之为
弹出窗口

当我单击调用并装载上述弹出窗口的元素时,会立即捕获文档单击事件

下面是一个JSFIDLE,其中包含简化的代码:

与此相反,这里是一个纯js版本,它可以正确绑定click事件:

作为交叉参考,以下是vue论坛帖子:


任何见解都值得赞赏

归功于
Vue
核心团队成员
LinusBorg

需要设置超时时间

下面是一个实现了
setTimeout
的工作示例:

英文解释:

  • 单击事件发生并进入捕获阶段<代码>父级
  • Vue组件处理此事件
  • parent
    组件设置内部
    $data
    标志以显示
    弹出窗口
    模块
  • 弹出窗口
    模块被实例化并装入。在创建的
    函数中,附加
    document.addEventListener
    事件
  • 单击事件捕获阶段完成并开始冒泡DOM
  • 单击事件现在由
    文档捕获
    ,因为我们刚刚添加了事件侦听器。它启动回调,看起来什么也没发生
  • 解决方案:

  • 单击事件发生并进入捕获阶段<代码>父级
  • Vue组件处理此事件
  • parent
    组件设置内部
    $data
    标志以显示
    弹出窗口
    模块
  • 弹出窗口
    模块被实例化并装入。在创建的
    函数中,在
    setTimeout
    函数中附加
    文档。addEventListener
    ,以便在单击事件完全完成后附加该文档
  • 单击事件捕获阶段完成并开始冒泡DOM
  • 事件的
    气泡
    阶段完成
  • setTimeout
    中的回调现在运行,文档现在侦听单击
  • 将捕获随后出现在
    文档
    中的任何单击

  • 您能否更明确地解释一下如何使用
    setTimeout
    解决您的问题?@thanksd。答复滞后2年。。。它在小提琴上: