为了账号安全,请及时绑定邮箱和手机立即绑定

使用jq框架,如何让事件在捕获阶段执行。

使用jq框架,如何让事件在捕获阶段执行。

千巷猫影 2018-09-24 20:15:02
比如在父元素A设置一个事件,在子元素B设置另一个事件。点击子元素的时候,我希望A的事件先触发(就是按照捕获阶段执行)但是我看过源码,jq绑定事件的addEventlistener只能冒泡执行。这令我不解,难道jq没有给出解决方法吗?这种情况应该有人遇到过才对,是怎么解决的呢?$(box).on('click',function(e){console.log(0)}); //并不是最先触发的$(b1).on('click',function(e){console.log(1)}); $(box).on('click.blur','.b1',function(e){console.log(2)});
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞



看来是jq本身没有打算为事件控制捕获顺序了。
那么我试着假设要为jq框架的基础上添加一个这样的功能,修改原先的程序。
首先为绑定事件(event.add)增加一个可选参数capture,用于决定捕获顺序。
正常来说jq只会为一个元素绑定一个addEventListener。但为了能按照捕获顺序触发函数,接收到有capture的事件,需额外绑定一个capture为true的addEventListener。
为jq事件处理对象(handlers)加上capture属性。
然后修改event.handlers方法,按照事件传播阶段(eventPhase)来判断现在触发的是捕获还是冒泡触发。如果是捕获触发,在处理程序列表(handlerQueue)内插入capture为true的handlers。然后就能按照正常流程执行处理程序。
以上的修改能保留原先的构造上增加捕获触发的功能,也能使用jq.off(解除绑定事件)。希望以后jq能增加这个功能吧。


查看完整回答
反对 回复 2018-09-24
  • 1 回答
  • 0 关注
  • 782 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信