如何进一步优化javascript表格行创建/插入?

时间:2009-08-26 21:22:24

标签: javascript jquery optimization

我正在使用jQuery。我有网站功能,它执行ajax搜索并返回JSON结果。然后,ajax回调使用结果填充表的行。通常,每次搜索都会插入100行。每行都有相当数量的数据。

代码看起来像这样(非常简略):

function search() {

  $.post("/search.php", { params: search_params }, searchDone, "json");

}

function searchDone(json) {

    var $table = $("#result_table");
    var html = "";
    for(i=0; i < json.results.length; i++) {

       html += rowHtml(results[i]);

    }

    $table.append(html);

}

function rowHtml(result) { /* much simplified version */

  var html = "<tr><td>";
  html += result.field1;
  html += "</td><td>";
  html += result.field2;
  html += "</td></tr>";
  return html;

}

表现缓慢。当html附加到表格时,浏览器会锁定。

有关如何优化此建议的任何建议?我是否更好地创建dom节点而不是尝试让jQuery呈现HTML?

7 个答案:

答案 0 :(得分:4)

您可以尝试推送到数组,然后使用array.join追加。

你总是附在桌子上吗?如果不是,则应将所有行包装在tbody中,然后替换现有的tbody节点。这更快,因为它实际上只有一个附加而不是x。

更新

Padolsey先生的Perf测试here

答案 1 :(得分:2)

jQuery在你的html字符串中获取所有<tr>并将它们创建为DOM节点(快速),逐个追加它们(慢)。

尝试使用单个<tbody>来保存行,然后jQuery只需要向表中附加1个元素:

var html = ["<tbody>"];
for(i=0, len=json.results.length; i < len; i++) {

   html.push(rowHtml(json.results[i]));

}
html.push("</tbody>");
$table.append(html.join(''));

正如您所看到的,我还做了一些其他微优化:在循环中缓存.length属性,以及use an array as a string buffer。他们没有多少收获,但值得了解。

答案 2 :(得分:1)

立即设置所有html,而不是依赖DOM插入。

function searchDone(json) {
    var $table = $("#result_table");
    var html = $table.html();
    for(i=0; i < json.results.length; i++) {
       html += rowHtml(results[i]);
    }
    $table.html($table.html() + html);
}

答案 3 :(得分:0)

这里可能有一些指示:

jQuery and appending large amounts of HTML

总的来说,似乎使用Array.join vs字符串连接来提高速度是一个被驱散的神话 - 或者我应该说在早期版本的浏览器中,是的,Array.join更快。但最近版本的浏览器极大地优化了字符串连接。

答案 4 :(得分:0)

您可以使用setTimeout而不是for循环。它在构建长HTML字符串时不会锁定浏览器。您也可以尝试将其作为整个tbody而不仅仅是行附加。

答案 5 :(得分:0)

您还应该使用更快版本的'for'循环: var $ table = $(“#result_table”);     var html =“”;

for(var i=0, var len= json.results.length; i < ; i++) {

  // etc...

}

答案 6 :(得分:0)

有点偏离主题,但我使用并推荐Javascript Rocks。本书包含了Scriptaculous创建者提供的一系列令人敬畏的JS优化建议。还附带了一个名为DOM Monster的工具,它可以帮助追踪性能瓶颈 - 这是对Firebug的一个很棒的称赞,因为它实际上通过DOM来追踪基于启发式和DOM复杂性的低效率。