Javascript 包含大量事件的大型表,使用事件冒泡是否更有效?
我有一个很大的表/网格,每行上都有事件、表头等 与其生成事件或将事件绑定到每个单元格,不如放置一个“全局”事件,然后我相信当单击或鼠标悬停事件发生时,它会在整个表上冒泡到我的“全局”事件,然后我会筛选事件调用方并作出反应 我以前读过,但不确定我的想法是否正确Javascript 包含大量事件的大型表,使用事件冒泡是否更有效?,javascript,jquery,Javascript,Jquery,我有一个很大的表/网格,每行上都有事件、表头等 与其生成事件或将事件绑定到每个单元格,不如放置一个“全局”事件,然后我相信当单击或鼠标悬停事件发生时,它会在整个表上冒泡到我的“全局”事件,然后我会筛选事件调用方并作出反应 我以前读过,但不确定我的想法是否正确 这种方法有什么不足之处吗?是的,你的想法是对的,是的,它更好。使用jQuery,它与直接绑定事件一样简单—请查找.delegate()方法。它允许您将事件处理程序放置在容器元素上,并告诉它如何基于普通jQuery选择器将事件路由到处理程序,
这种方法有什么不足之处吗?是的,你的想法是对的,是的,它更好。使用jQuery,它与直接绑定事件一样简单—请查找
.delegate()
方法。它允许您将事件处理程序放置在容器元素上,并告诉它如何基于普通jQuery选择器将事件路由到处理程序,以过滤实际的事件目标
因此:
这通常是一个好方法。实现过滤的最佳方法是使用原生jQuery
$().delegate()
函数,正如Pointy所建议的那样。这肯定会更有效率
要记住的主要问题是,并不是所有的事件都会在默认情况下冒泡。jQuery试图解决这个问题,但据我所知,表单上的submit
事件在InternetExplorer中没有出现
另一个要记住的问题是,如果调用
event.stopPropagation()
(或从绑定函数返回false),则不会调用树上更高级别的绑定函数。我认为您的想法是正确的。你可以这样做:
$("table#yourTable").click(function(evt){
if($(evt.target).is('td.someTd')) {
//do whatever you want to do
}
})
因此,只绑定一个单击事件并过滤单击的目标元素
$("table#yourTable").click(function(evt){
if($(evt.target).is('td.someTd')) {
//do whatever you want to do
}
})