focus如何实现事件委托

作者: Stevenzwzhai | 来源:发表于2018-03-29 18:50 被阅读147次

事件委托是利用事件冒泡机制的一种优化手段,如果有很多列表元素要绑定事件,那么就可以用事件委托来优化(不需要给每个元素都绑定事件)。但是对于focus这种特殊的表单事件,它不会冒泡,那么又该如何实现这一优化呢?有的人会说这个会同时触发click,但是如果我是通过tab切换呢?

js事件机制

js的事件机制有两种,事件冒泡和事件捕获,冒泡呢就是从触发事件的节点开始一层一层的往父节点传播;而事件捕获恰恰相反,是从根节点(document)往子节点中传播。

dom事件

1.DOM0级事件处理
dom.onclick = function(){//code}
这些事件会在事件冒泡阶段来处理,注意绑定事件必须要再dom节点存在之后。在函数中this关键字将指向目标元素,可以通过this访问所有的属性、方法。
删除绑定事件:直接重新绑定事件即可。
2.DOM2级事件处理
主要使用addEventListener/removeEventListener
dom.addEventListener(type, fn, option)
这里基本就是三个参数,第一个表示事件类型(click...),第二个事件处理函数,这个函数默认有个参数event,可以通过参数event获取一些信息,也可以通过this来获取,第三个就有些区别了可以是一个对象,也可以是一个boolean。
如果是个对象的时候:

options{
        capture:Boolean //表示会在捕获阶段传播到该EventTarget上执行。
        once:Boolean//表示只调用一次
        passive:Boolean //表示listener永远不会调用preventDefault.默认是false,但是监听touch等事件chrome54之后版本会自动转为true。
}

如果是一个Boolean时,表示是否在捕获阶段处理事件。
解除绑定要注意,函数必须要和之前绑定的要一致,这里的一致是指向一致,并不是写成一样的就可以,函数是引用类型,所以通过变量来处理即可。

let fn = function (){}
//绑定
obj.addEventListener('click', fn, false)
//解除
obj.removeEventListener('click', fn, false)

当然对于IE8及一下需要用attachEvent/detachEvent来处理,不同点就在于只有两个参数,第一个参数同样是事件类型,但是要加上'on',第二个就是处理函数,没有第三个参数因为它支持事件冒泡。
函数中的参数event有很多属性方法,其中eventPhase可以判断事件的触发情况,1表示捕获,2表示处于目标,3表示冒泡,而一个完整的事件流程大致就是捕获->事件目标->冒泡
通过上面的知识我们很容易就想到在捕获阶段去获取事件就可以实现事件委托的效果。

parentObj.addEventListener('focus', fn, true)

相关文章

  • 事件委托

    focus事件如何实现事件委托?事件委托是利用事件冒泡来做,但是父元素没有focus事件,这咋监听啊?一脸懵逼。。...

  • focus如何实现事件委托

    事件委托是利用事件冒泡机制的一种优化手段,如果有很多列表元素要绑定事件,那么就可以用事件委托来优化(不需要给每个元...

  • unity 委托事件

    定义委托及事件 实现事件监听+=(事件取消监听为-=)

  • 封装一个通用的事件监听函数

    封装一个通用的事件监听函数,可实现普通的事件监听,也可实现事件委托(事件代理)

  • JavaScript的事件代理和事件委托

    JavaScript中的事件委托是很重要的一个东西,事件委托依靠的就是事件冒泡和捕获的机制。 事件冒泡怎么实现,先...

  • 原生 JS 实现事件委托

    什么是事件委托 事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事...

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • 事件委托(事件代理)

    事件委托原理:事件冒泡机制 优点: 1.大量减少内存占用,减少事件注册。 2.新增元素实现动态绑定事件 实现方式:...

  • 10.30学习总结

    今天讲了委托和事件。 委托的声明:可以在定义类的任何地方定义委托。 委托的实例化和调用,以委托的形式实现了函数指针...

  • 事件委托

    ------------------事件委托----------------- 事件: 事件委托: 原理: 冒泡 ...

网友评论

    本文标题:focus如何实现事件委托

    本文链接:https://www.haomeiwen.com/subject/rqlvcftx.html