事件代理可以在捕获阶段实现吗?

问题描述:

除去老版本浏览器兼容性的原因,事件代理可以在捕获阶段实现吗?简单描述下过程,谢谢。

试验链接:http://jsbin.com/rimiruhutu/e...

阅读 4.4k
4 个回答

参考这篇文章,获得了答案:

对于事件代理来说,在事件捕获或者事件冒泡阶段处理并没有明显的优劣之分,但是由于事件冒泡的事件流模型被所有主流的浏览器兼容,从兼容性角度来说还是建议大家使用事件冒泡模型。

http://www.cnblogs.com/Chen-X...

事件有两种触发类型:一种是冒泡型一种是捕获型
冒泡型事件:从目标元素开始触发,然后触发其父元素上定义的同类型事件,再然后父元素的父元素...
捕获型事件:从目标元素的父元素上定义的同类型事件开始触发,然后其子元素,直到触发目标元素上定义的事件

对于你问题描述中说的 事件代理 ,应该是指不直接通过: domEle.addEventListener(event , fn , type) 这种方式定义,而是通过 loginEvent(domEle , event , fn , type) 这种方式去定义,就是委托第三方来定义事件。

如果是这样的话,你的这个现象应该类似下面这种:

// 事件代理(第三方注册事件的函数|对象)
function loginEvent(domEle , event , fn , type){
    domEle.addEventListener(event , fn , type);
}

// 注意第三个参数:表示是在捕获阶段触发
btn.addEventListener('click' , function(){
    // 按下这个按钮的时候:从 btn 的最顶级父元素上的 click 事件开始
    // 触发,然后直到 btn 上定义的 click 事件触发
    // 事件代理开始工作.....
    loginEvent(domEle , event , fn , type);    
} , true);

不知道对否??

这跟冒泡阶段代理没啥不一样吧。。。
只不过事件发生的阶段变了。。。

个人以为事件捕获更适合“提前”处理的场景,比如有些时间是需要在父元素上处理但是不需要子元素参与、或者是需要避免子元素触发事件这种情况。但如果是事件监听这种用法,如果把事件绑定到父元素上,那么事件在触发时并没有到达子元素,也就无法判定是不是需要处理……不像是事件冒泡,子元素事件触发时一级级往上冒,碰到挂着事件监听的父元素时停下来,然后父元素核验了target之后发现就是这哥们儿之后就直接进处理过程了……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题