比如在父元素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能增加这个功能吧。
添加回答
举报
0/150
提交
取消