循环遍历项目并向其添加处理程序会损害性能

时间:2011-10-06 16:14:06

标签: javascript jquery performance javascript-events

当我遍历列表项并将clickalsler添加到所有单独的项目时,是否会影响性能?

我这样做的原因是因为我只想让列表项可以点击,如果它包含超链接。

我目前使用的代码是:

$('ul.paginator li').each(function() {
  if ($('a', this).length > 0) {
    $(this).css('cursor', 'pointer');
    $(this).click(function() {
      location.href = $('a', this).attr('href');
    });
  }
});

3 个答案:

答案 0 :(得分:2)

我不确定它会对性能产生多大影响,但您是否考虑过使用简化的jQuery选择器:

$('ul.paginator li:has(a)').each(
    function(){
        $(this).css('cursor','pointer').click(
            function(){
                location.href = $(this).find('a').attr('href');
            });
    });

顺便提一下,性能取决于您搜索的元素数量,而不是其他任何元素。只有少数,它可能是难以察觉的,几千,它(可能)会引人注意。


已修改以降低has()

的费用
$('ul.paginator li a').each(
    function(){
        var address = this.href;
        $(this).closest('li').css('cursor','pointer').click(
            function(){
                location.href = address;
            });
    });

这应该更便宜,因为它只选择a中的li元素,然后向上移动以影响li元素。

答案 1 :(得分:0)

是的,最好将delegate与适当的选择器一起使用,该选择器只选择您想要的项目。

只会创建并附加一个处理程序。

如果你不想使用has(),那就足够了(不需要多个处理程序):

$('ul.paginator').delegate('click', 'li', function() {
    var link = $('a', this);
    if (link.length > 0) {
        location.href = link.attr('href');
    }
});

答案 2 :(得分:0)

取决于有多少行。如果有成千上万,那么是的。如果数量适中,那么就不足为明了。

另一种方法是将click处理程序放在包含项的元素上,然后在单击事件进入时,使用传递给处理程序的事件中的数据来确定要执行的操作。一个处理程序。