使用jQuery的event.stopPropagation()有什么正确的心态

时间:2012-04-19 23:17:24

标签: javascript javascript-events jquery

关于如何应用jQuery的event.stopPropagation()

,我有两种方法
  1. 乐观方法 - 默认情况下,所有事件处理程序都是 ,不带 stopPropagation()。只有在事件冒泡导致某些不必要和不受欢迎的行为时,才会将stopPropagation()添加到处理程序中。
  2. 悲观方法 - 默认情况下,stopPropagation()会添加到所有事件处理程序中。如果由于连接冒泡而导致某些所需行为丢失,则相应的stopPropagation()将被删除。
  3. 我想知道在我的开发中使用stopPropagation()时,我应该拥有的两种思维模式中的哪一种,或者两者都不是。我更倾向于2)因为看起来它会有更好的性能,因为防止了不必要的冒泡。我想听听专家的意见。

2 个答案:

答案 0 :(得分:3)

到处拨打stopPropagation并不好。它打破了事件委托*,可能效率较低,除非你真的为页面上的每个元素添加处理程序(如果你这样做,你应该使用事件委托),你可能不记得这样做。

经验法则:只在需要时才调用stopPropagation


*即.live.delegate.on的委托版本。


以下是事件委派的示例,它依赖于冒泡来侦听源自在创建侦听器之后添加的元素的事件:

document.documentElement.addEventListener('click', function(e) {
    if(e.target.nodeName === 'a') {
        console.log('A link was clicked!');
    }
});

这里有人抛出jQuery打破了:

$('div').click(function(e) {
    e.stopPropagation();
});

作为<a>后代的任何<div>将不再处理其点击次数!请不要这样做。

答案 1 :(得分:1)

仅在您确实需要时才致电stopPropagation。请记住,如果您使用jQuery live函数并停止它,则永远不会调用实时处理程序,因为live事件存储在document元素中。