首页 > 一个列表在渲染和绑定事件的时候,怎么处理好?//js对象

一个列表在渲染和绑定事件的时候,怎么处理好?//js对象

后端给我一个数组,每个数组对应图片上的一行数据,这样的列表怎么渲染和绑定事件(点击地图展现不同酒店的map)比较好?
1.我一次性全部都渲染完毕拍在页面上,坐标信息放在 dom元素的attribute上。

//绑定点击地图事件
$("content").on("click","li",function(){
    //show map
    //通过 getAttribute()获得坐标信息。
})

2.每一行当作一个对象看待,渲染一行就new一个对象,坐标信息都放在对象实例中,然后append到页面中。

//绑定点击地图事件
$(",map").bind("click"function(){
    //show map
    //通过this 获得坐标信息
})

哪种效率比较高?


第1种方法,
content元算下的子元素多的话,冒泡经过的元素就会很多,效率就不高了
第2种方法更有效率些
1行数据只有1个map吧,此时坐标信息像第1种方法那样作为自有属性加到元素中去
地图


关于效率,我觉得还是第一种比较高,但我更推荐第二种,因为第二种更符合分层的编程思想。


对于一个现代Web页面来讲,前者好。前者是事件代理的方式,后者是直接绑定的方式

  1. 首先谈谈效率。作为电商网站或者罗列内容的网站,数据量是很大的。即使现在不大将来也会变大,或者你的代码将被复用到量大的页面去。我们知道事件代理delegate(你用的是on的写法)是可以提高绑定效率的,因为它只会进行一次DOM API的调用(addEventListener,对于旧版IE是attachEvent,不过jQuery2已经干掉了所有的IE支持)。当表项很多时,确实会导致页面卡顿。关于事件代理和直接绑定的更多讨论可以见这里:http://harttle.com/2015/06/26/jquery-event.html

  2. 再来看健壮性。相信你的页面中已经有不少AJAX了,页面肯定存在局部更新。这种情况下,如果你是通过bind绑定的,每个新增元素都需要重新bind,但如果是delegate或者on创建的事件代理则会自动生效。很简单,因为事件是绑定在父级上的,当事件发生后才会去检查子元素。如何做到的?见:http://harttle.com/2015/07/31/javascript-event.html

  3. 最后看看趋势。不知你的网站中是否使用了客户端模板引擎?像handlebars、AngularJS等,这些东西会非常频繁地更新DOM。使用事件代理会减少很多麻烦。

当然,要注意的是普通绑定的时间消耗在绑定事件时,而事件代理的时间消耗在事件发生时,因为事件发生后需要去寻找对应元素,所以content下有太多东西的话可能会很慢。这也是为什么jQuery干掉了$.fn.live方法,因为它是直接绑在body上的事件代理。

【热门文章】
【热门文章】