猿问

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

比如在父元素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)});


千巷猫影
浏览 783回答 1
1回答

临摹微笑

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

相关分类

JavaScript
我要回答