javascript - 单击时添加事件侦听器但立即运行?
问题描述
我在单击按钮时添加一个事件:
this.$refs.btn.addEventListener('click', this.turnOn);
在turnOn
方法中,我在文档上添加了一个侦听器,以运行该turnOff
方法。
turnOn() {
document.addEventListener('click', this.turnOff);
}
然后在测试期间,我单击按钮并turnOn
运行该方法,但初始单击也运行文档单击侦听器。
如何运行该turnOn
方法,添加文档侦听器,但在初始按钮单击时不运行文档单击侦听器?
解决方案
这是由于事件冒泡。当您单击事件<button>
监听器时,它会附加到主体,然后由于冒泡而被调用。
您可以使用event.stopPropgation()
. 下面是两个片段,可以看出区别。
非工作
document.querySelector('button').addEventListener('click',(e)=>{
document.addEventListener('click',()=>console.log("body clicked"));
console.log("button clicked")
})
<body>
<button>Test</button>
</body>
注意:上面的非工作示例还在每次点击测试时添加了多个点击事件
在职的
document.querySelector('button').addEventListener('click',(e)=>{
e.stopPropagation();
document.addEventListener('click',()=>console.log("body clicked"));
console.log("button clicked")
})
<body>
<button>Test</button>
</body>
推荐阅读
- javascript - 我怎样才能用 Momentjs 格式化日期看起来像这样?
- angular - PWA swupdate.available 仅在 localhost 上触发。使用 nginx 反向代理 [Angular 9] 使用自定义基本 href 部署时不起作用
- c - 动态结构分配后如何修复堆损坏?
- swiftui - 如何访问符合 UIViewRepresentable 的 SwiftUI 包装器中的属性?
- alexa-skills-kit - Alexa Skill Lambda 返回,但 Alexa 说无效响应
- c# - 如何在 Windows 窗体 C# 中将数据传递回主窗体
- google-apps-script - 为什么使用我的脚本的其他人没有显示用户缩略图?
- reactjs - 材料表ReactJs切换detailPanel从动作打开/关闭
- c++ - 在 cpp 中使用互斥锁的生产者消费者问题
- sql - 鉴于 Netezza 在聚合时不支持 First 和 Last,如何进行?