链接 DOM 所有事件总览

DOM 事件通过 addEventListener 添加
默认是冒泡 通过第三个参数bool控制
先捕获 后冒泡

  1. div.addEventListener('click',fn[,true])
  2. 默认
  3. div.addEventListener('click',(e)=>{
  4. console.log(e)
  5. e 只在事件阶段存在,事件结束就消失
  6. })

e.target vs e.currentTarget
e.target 是点击的那个元素
div > span{文字},用户点击文字
e.target 是span
e.currentTarget 是 div

e.stopPropagation() 可用来阻止默认冒泡

image.png

自定义DOM Event

  1. // 添加一个适当的事件监听器
  2. obj.addEventListener("cat", function(e) { process(e.detail) })
  3. // 创建并分发事件
  4. var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}})
  5. obj.dispatchEvent(event)
  1. <template>
  2. <div class="popover" @click.stop="xxx">
  3. // 事件 + stop可以阻止事件冒泡传递
  4. <div class="content-wrapper" v-if="visible" @click.stop>
  5. <slot name="content"></slot>
  6. </div>
  7. <slot></slot>
  8. </div>
  9. </template>
  10. methods: {
  11. xxx() {
  12. this.visible = !this.visible;
  13. if (this.visible === true) {
  14. this.$nextTick(() => {
  15. //直接修改 visible===true 会导致无法显示,需要nexttick/settimeout等待执行后
  16. // function xxx(){}.bind(this) 和 箭头函数()=>{} 相等 但是返回一个新的函数
  17. function xxx(){
  18. this.visible = false
  19. document.removeEventListener('click', eventHandler)
  20. }.bind(this)
  21. let eventHandler = () => {
  22. this.visible = false
  23. console.log('document 隐藏 popover')
  24. document.removeEventListener('click', eventHandler)
  25. }
  26. document.addEventListener('click', eventHandler)
  27. })
  28. }else{
  29. console.log('vm 隐藏 popover')
  30. }
  31. }
  32. }
  33. 监听document.body身上的事件有时候不一定能点击到 body大小不固定
  34. 选择监听document
  35. //document.addEventListener('click', eventHandler)