Javascript 什么';这是使用jQuery的正确心态;s event.stopPropagation()事件

Javascript 什么';这是使用jQuery的正确心态;s event.stopPropagation()事件,javascript,javascript-events,jquery,Javascript,Javascript Events,Jquery,关于如何应用jQuery的event.stopPropagation(),我有两种方法: 乐观方法-默认情况下,所有事件处理程序都没有stopPropagation()stopPropagation()添加到处理程序中 悲观方法-默认情况下,stopPropagation()添加到所有事件处理程序中。如果由于断开连接甚至冒泡而缺少某些所需的行为,则相应的stopPropagation()将被删除 我想知道在我的开发中使用stopPropagation()时,这两者中的哪一个(或者两者都不是)是我

关于如何应用jQuery的
event.stopPropagation()
,我有两种方法:

  • 乐观方法-默认情况下,所有事件处理程序都没有
    stopPropagation()
    <只有在事件冒泡导致一些不必要和不希望的行为时,才会将代码>stopPropagation()添加到处理程序中
  • 悲观方法-默认情况下,
    stopPropagation()
    添加到所有事件处理程序中。如果由于断开连接甚至冒泡而缺少某些所需的行为,则相应的
    stopPropagation()
    将被删除

  • 我想知道在我的开发中使用
    stopPropagation()
    时,这两者中的哪一个(或者两者都不是)是我应该具备的心态。我更倾向于2),因为它看起来会有更好的性能,因为不必要的冒泡会被阻止。我想听听专家们对这个话题的看法。

    到处打电话给
    stopPropagation
    并不好。它破坏了事件委派*,可能效率较低,除非您确实向页面上的每个元素添加处理程序(如果您这样做,您应该使用事件委派),并且您可能不记得这样做

    因此,经验法则是:只在需要时调用
    stopPropagation


    *也就是说,
    .live
    .delegate
    ,以及上的
    .delegate版本


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

    document.documentElement.addEventListener('click', function(e) {
        if(e.target.nodeName === 'a') {
            console.log('A link was clicked!');
        }
    });
    
    有人抛出jQuery打破了这一点:

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

    任何
    的后代将不再处理其点击!请不要这样做。

    到处调用
    stopPropagation
    是不好的。它破坏了事件委派*,可能效率较低,除非您确实向页面上的每个元素添加处理程序(如果您这样做,您应该使用事件委派),并且您可能不记得这样做

    因此,经验法则是:只在需要时调用
    stopPropagation


    *也就是说,
    .live
    .delegate
    ,以及
    上的
    .delegate版本


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

    document.documentElement.addEventListener('click', function(e) {
        if(e.target.nodeName === 'a') {
            console.log('A link was clicked!');
        }
    });
    
    有人抛出jQuery打破了这一点:

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

    任何
    的后代将不再处理其点击!请不要这样做。

    只有在您真正需要的时候才呼叫
    stopPropagation
    。请记住,如果您使用jQuery
    live
    函数并停止它,live处理程序永远不会调用,因为
    live
    事件存储在
    document
    元素中。

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

    调用
    stopPropagation
    只会更改事件对象,以便祖先元素忽略它,但该事件实际上仍然会使DOM冒泡并产生开销。@Jasper-不知道这一点!那么,我心目中的更好的表现将永远无法实现。谢谢你让我知道。调用
    stopPropagation
    只会更改事件对象,使祖先元素忽略它,但事件实际上仍然会使DOM冒泡并产生开销。@Jasper-不知道这一点!那么,我心目中的更好的表现将永远无法实现。谢谢你让我知道。通过事件委派进行绑定速度更快(在谈论更多元素时更是如此),但事件处理程序启动所需的时间会增加。这难道不意味着直接绑定到元素会更快地响应交互吗?虽然我大体上同意你的回答,但谢谢你花时间。@Jasper:这不是重点-你仍然绝对需要事件委派,比如说,处理创建侦听器后添加的元素上的事件。看最新消息。是的,我明白你的意思。尽管我认为人们太快地转向委托,例如,当通过AJAX请求添加新元素时,您可以在将元素添加到DOM之前绑定到元素。通过事件委托进行绑定速度更快(在谈论更多元素时更是如此),但事件处理程序启动所需的时间会增加。这难道不意味着直接绑定到元素会更快地响应交互吗?虽然我大体上同意你的回答,但谢谢你花时间。@Jasper:这不是重点-你仍然绝对需要事件委派,比如说,处理创建侦听器后添加的元素上的事件。看最新消息。是的,我明白你的意思。尽管我认为人们太快转向委托,例如,当通过AJAX请求添加新元素时,您可以在将元素添加到DOM之前绑定到元素。稍微更正一下,
    .live()
    绑定到
    文档
    元素
    .live()
    $(document)相同。委托(选择器、事件、事件处理程序)
    。稍做更正,
    .live()
    绑定到
    文档
    元素
    .live()
    $(document).delegate(选择器、事件、事件处理程序)
    相同。