我有一个Vue
组件,在其created
生命周期方法中为文档添加了一个事件监听器,以捕获根$el
之外的任何点击。我们称之为Popup
当我点击召唤并安装上述Popup
的元素时,会立即捕获文档点击事件。
这是一个简化代码的jsfiddle:https://jsfiddle.net/awei01/5vuqjcxd/
而且,相比之下,这是一个正确绑定点击事件的纯js版本:https://jsfiddle.net/awei01/qzqku0w9/
作为交叉参考,以下是vue论坛帖子:https://forum.vuejs.org/t/document-addeventlistener-captures-a-click-preceding-listeners-creation/11558
任何见解都表示赞赏。
答案 0 :(得分:1)
归功于Vue
核心团队成员LinusBorg
。
需要setTimeout
以下是实施setTimeout
的工作示例:https://jsfiddle.net/awei01/ovr9sr6k/
英文说明:
capture
阶段。 parent
Vue组件处理此事件。parent
组件设置内部$data
标志以显示popup
模块popup
模块被实例化并挂载。在created
函数中,附加document.addEventListener
事件。 capture
阶段完成并开始冒泡DOM。 document
捕获,因为我们刚刚添加了事件监听器。它会触发回调,看起来没有发生任何事情。解决方案:
capture
阶段。 parent
Vue组件处理此事件。parent
组件设置内部$data
标志以显示popup
模块popup
模块被实例化并挂载。在created
函数中,将document.addEventListener
附加到setTimeout
函数中,以便在点击事件完全完成后附加它。 capture
阶段完成并开始冒泡DOM。 bubble
阶段完成setTimeout
内的回调现在正在运行,而文档现在会收听点击次数document
的点击次数。