当我遍历列表项并将clickalsler添加到所有单独的项目时,是否会影响性能?
我这样做的原因是因为我只想让列表项可以点击,如果它包含超链接。
我目前使用的代码是:
$('ul.paginator li').each(function() {
if ($('a', this).length > 0) {
$(this).css('cursor', 'pointer');
$(this).click(function() {
location.href = $('a', this).attr('href');
});
}
});
答案 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处理程序放在包含项的元素上,然后在单击事件进入时,使用传递给处理程序的事件中的数据来确定要执行的操作。一个处理程序。