我有一个父视图,其中包含400个子视图。如果我在每个视图中注册2个事件,那将是800个将被litsitening的事件。
我的问题是我应该在子视图中注册事件,还是应该使用气泡事件来捕获父级别的事件。
这是优化和有效的。
提前致谢
答案 0 :(得分:1)
GEOADD geoset lon lat name:data1:data2:...:datan
如果上面是结构,我的父骨干视图将如下所示,显然我将在父视图中创建监听器。为什么我们需要在400个子视图中具有相同的侦听器功能?
<div id="parent">
<div id="child1" class="child"/>
<div id="child2" class="child"/>
<div id="child3" class="child"/>
....
....
<div id="child400"/>
</div>
答案 1 :(得分:1)
您正在寻找的是event delegation,是的,它可以很好地扩展,而将大量的侦听器附加到单个元素则不会。根据我的经验,当你设置处理程序时,你会遇到性能损失最严重的部分。
Another answer on SO也涉及性能影响,以及this test on jsPerf的链接(目前无法使用,因为jsPerf因大修而关闭)。
或许更有用的是我的这两个演示:使用Backbone生成1000个元素,一次with event delegation,另一次without。
从演示中可以看出,影响很大。演示中设置了三个事件 - mousedown
,mouseup
,click
- 生成页面的时间在没有事件委派的演示中大致翻了一倍。
另一方面,如果你看一下源代码,当你使用委托时,你会发现有些事情会变得有点复杂。将处理程序绑定到单个项视图(this.model.get( "number" )
)时,很容易访问模型数据。如果使用委托,则必须采用间接方式。因此,与往常一样,是的权衡。只要你只看表演,就没有。