Dom事件模型&事件委托

1.w3c事件模型[dom事件流]

W3C规定了Dom事件流的访问顺序为:先捕获 => 在冒泡?

        提供了执行调用监听事件两种事件流:冒泡流(默认) | 捕获流 

add.eventListner(eventName,fn,bool)

 [defult]bool === false  //调用监听函数顺序为冒泡流
         bool === true   //调用监听函数顺序为捕获流

例:饥人谷JS Bin

2. 如何阻止页面滚动

// 1.阻止鼠标滚轮滚动
x.addEventListener('wheel', (e)=>{
  e.preventDefault()
})


// 2.阻止触屏滚动
x.addEventListener('touchstart', (e)=>{
  e.preventDefault()
})



/* 3.隐藏滚动条 */
::-webkit-scrollbar {
 /*  width: 0 !important */
  overflow: hidden
}

例:https://jsbin.com/kayaweqoki/1/edit?html,css,js,output 

3.添加自定义事件

//生成一个自定义事件CustomEvent,添加事件信息detail
//触发事件dispatchEvent
button1.addEventListener('click',()=>{
  const event=new CustomEvent('frank',{
    detail: {name: 'frank',age: 18},
    bubbles: true,
    cancelable: true,
  })
  button1.dispatchEvent(event)
})


//监听自定义'frank'事件
div1.addEventListener('frank',(e)=>{
  console.log('click dispatchEvent frank')
  console.log(e.detail)
  console.log(e)
})

 运行:JS Bin - Collaborative JavaScript Debugging

4.事件委托

事件委托就是监听祖先元素,判断被点击的元素是否是我们想监听的元素,若是,则执行函数。 优点:节省内存  /  可以监听动态生成的元素

例1:监听父元素节省内存

//给多个相同子元素添加监听器,浪费太多内存 -> 监听其祖先元素,节省内存
div1.addEventListener('click',(e)=>{
  const t=e.target
  if(t.tagName.toLowerCase() === 'button'){
    console.log('button被点击了')
    console.log('button内容是'+t.textContent)
    console.log('button data-id:'+t.dataset.id)
  }
})

JS Bin - Collaborative JavaScript Debugging

例2: 可以监听动态生成的元素

//1s 后才生成的元素无法被监听 -> 事件委托,监听其父元素
setTimeout(()=>{
  const button=document.createElement('button')
  button.textContent='click 1'
  div1.appendChild(button)
},1000)


//显示父元素被监听
div1.addEventListener('click',(e)=>{
  const t=e.target
  if(t.tagName.toLowerCase()==='button'){
    console.log('button 被 click')
  }
})

JS Bin - Collaborative JavaScript Debugging

[事件委托原理:利用事件冒泡]

  • 当元素的事件委托到它的父层或者更外层元素上的时候, 其实是绑定事件外层元素
  • 当事件响应到需要绑定的元素上时,会通过事件冒泡机制触发其外层元素的绑定事件,然后在外层元素上执行函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值