2011-10-06 32 views
1

当我遍历列表项并将clickhandler添加到所有单独的项目时,它会在性能上造成伤害吗?通过项目循环和添加处理程序来伤害性能

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

我currenlty使用的代码是:

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

回答

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; 
      }); 
    }); 

这应该是更便宜,因为它会在li内只选择那些a元素,然后向上移动到影响li元件。

+0

':has(a)'is计算昂贵 – Raynos

+0

@David Thomas:太棒了!没有想过有()'!正是我在找什么。我甚至没有'each()'的用法。我现在可以这样做:'$('ul.paginator li:has(a)')。click(function(){})。css();' – PeeHaa

+0

@Raynos:owh :(它有多糟糕? – PeeHaa

0

是的,这是更好地使用delegate与只选择你需要的产品的适当选择。

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

如果你不想使用has()比这将是足够的(不需要多个处理程序):

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

但事情是:没有适当的选择器。如果错了,纠正我。 – PeeHaa

+0

如果您不想使用'has',则更新了答案。 –

+0

上述代码中光标在哪里更改? – PeeHaa

0

取决于有多少行是。如果有成千上万的话,那么是的。如果数量适中,则不够明显。

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