如何通过附加图标来提高jQuery的性能?

时间:2013-07-05 15:23:14

标签: javascript jquery performance

我正在使用jQuery构建电子表格编辑器,我遇到了大表的性能问题。 该表包含许多数据集,单击其中一个时,图标将添加到其他集的第一个单元格中。代码如下所示:

$('.click_icon').remove();
for (var i = 0; i < datasets.length; i++) {
  var first_cell = $('td.content[dataset="' + datasets[i].id + '"]').filter(':first');
  if (in_group(datasets[i].id)) {
    first_cell.append('<i class="icon-remove click_icon remove_group" style="float:right"></i>');
  } else {
    first_cell.append('<i class="icon-magnet click_icon add_group" style="float:right"></i>');
}

拥有500多个数据集,大约需要5秒钟。 in_group()只是一个小函数,用于检查集合是否在具有所选数据集的组中。

我想知道在点击之前创建图标并使用show() hide()会更快吗?还有其他想法吗?

我在Ubuntu上使用Chromium。 (版本28.0.1500.52 Ubuntu 12.04)

3 个答案:

答案 0 :(得分:3)

在内存中构建表,只更改DOM一次:

$('.click_icon').remove();
var table = $('table');
var clone = table.clone(true);

for (var i = 0; i < datasets.length; i++) {
  var _class = in_group(datasets[i].id) ? 
                     'icon-remove click_icon remove_group' : 
                     'icon-magnet click_icon add_group',
      elem   = $('<i />', {'class': _class, style:'float:right'});

  $('td.content[dataset="' + datasets[i].id + '"]', clone).filter(':first')
                                                          .append(elem);
}

table.replaceWith(clone);

这是一个一般示例,您可能需要对其进行调整以使其与您的标记一起正常工作 我通常使用普通的JS来提高性能和documentFragments,但我认为jQuery在这样做时会在内部使用片段。

答案 1 :(得分:0)

根据我的经验,按字符串追加元素比使用DOM创建元素更糟糕。

所以尝试这样的事情:

if (in_group(datasets[i].id)) {
   var i = document.createElement('i');
   i.className = 'icon-remove click_icon remove_group';
   i.style.float = 'right';
   first_cell.appendChild(i);
} 

答案 2 :(得分:0)

如果您希望用户点击,我认为在点击之前创建图标是一个好主意。

您可以使用visibility property而不是显示/隐藏哪个切换显示属性。当可见性从隐藏变为可见时,浏览器不需要重新计算布局。