Javascript 什么';这是使用jQuery的正确心态;s event.stopPropagation()事件
关于如何应用jQuery的Javascript 什么';这是使用jQuery的正确心态;s event.stopPropagation()事件,javascript,javascript-events,jquery,Javascript,Javascript Events,Jquery,关于如何应用jQuery的event.stopPropagation(),我有两种方法: 乐观方法-默认情况下,所有事件处理程序都没有stopPropagation()stopPropagation()添加到处理程序中 悲观方法-默认情况下,stopPropagation()添加到所有事件处理程序中。如果由于断开连接甚至冒泡而缺少某些所需的行为,则相应的stopPropagation()将被删除 我想知道在我的开发中使用stopPropagation()时,这两者中的哪一个(或者两者都不是)是我
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
。请记住,如果您使用jQuerylive
函数并停止它,live处理程序永远不会调用,因为live
事件存储在document
元素中。只有在您确实需要时才调用StopperPagation
。请记住,如果您使用jQuerylive
函数并停止它,live处理程序永远不会调用,因为live
事件存储在document
元素中。调用stopPropagation
只会更改事件对象,以便祖先元素忽略它,但该事件实际上仍然会使DOM冒泡并产生开销。@Jasper-不知道这一点!那么,我心目中的更好的表现将永远无法实现。谢谢你让我知道。调用stopPropagation
只会更改事件对象,使祖先元素忽略它,但事件实际上仍然会使DOM冒泡并产生开销。@Jasper-不知道这一点!那么,我心目中的更好的表现将永远无法实现。谢谢你让我知道。通过事件委派进行绑定速度更快(在谈论更多元素时更是如此),但事件处理程序启动所需的时间会增加。这难道不意味着直接绑定到元素会更快地响应交互吗?虽然我大体上同意你的回答,但谢谢你花时间。@Jasper:这不是重点-你仍然绝对需要事件委派,比如说,处理创建侦听器后添加的元素上的事件。看最新消息。是的,我明白你的意思。尽管我认为人们太快地转向委托,例如,当通过AJAX请求添加新元素时,您可以在将元素添加到DOM之前绑定到元素。通过事件委托进行绑定速度更快(在谈论更多元素时更是如此),但事件处理程序启动所需的时间会增加。这难道不意味着直接绑定到元素会更快地响应交互吗?虽然我大体上同意你的回答,但谢谢你花时间。@Jasper:这不是重点-你仍然绝对需要事件委派,比如说,处理创建侦听器后添加的元素上的事件。看最新消息。是的,我明白你的意思。尽管我认为人们太快转向委托,例如,当通过AJAX请求添加新元素时,您可以在将元素添加到DOM之前绑定到元素。稍微更正一下,.live()
绑定到文档
元素.live()
与$(document)相同。委托(选择器、事件、事件处理程序)
。稍做更正,.live()
绑定到文档
元素.live()
与$(document).delegate(选择器、事件、事件处理程序)
相同。