在每次迭代中附加到 dom 或创建一个数组并输出?

Posted

技术标签:

【中文标题】在每次迭代中附加到 dom 或创建一个数组并输出?【英文标题】:Appending to the dom inside each iteration or create an array and output? 【发布时间】:2010-11-17 05:59:47 【问题描述】:

我发布了a question yesterday 处理解析 json 数据。在一个后续回答中,有人说我在每次迭代中使用 jQuery append() 函数时性能受到了影响,同时使用 each()。

我在做:

$.getJSON("http://myurl.com/json?callback=?", 
  function(data)         

  // loop through each post 
  $.each(data.posts, function(i,posts) 

    ... parsing ...

    // append
    $('ul').append('<li>...</li>');

  ); 

 );

我修改成这样:

$.getJSON("http://myurl.com/json?callback=?", 
  function(data)  

     // create array
     arrPosts = new Array(); 

      // loop through each post
      $.each(data.posts, function(i,posts) 

       ... parsing ...

        arrPosts[i] = '<li> ... </li>'; 

      );           

      // output
      for (i=0;i<arrPosts.length;i++) 
        $('ul').append(arrPosts[i]); 
       

  );

这似乎工作正常,示例演示:http://jsbin.com/isuro

但是我这样做对吗?我有点像菜鸟,只是想确保我正确地处理了这个问题。感谢您的建议!

【问题讨论】:

【参考方案1】:

你还是做错了。关键是您不想在循环中修改 DOM,因为它太慢了。您正在将项目添加到数组中,因此您可以在一个函数调用中添加所有项目:

$('ul').append(arrPosts.join('')); 

【讨论】:

【参考方案2】:

在大多数浏览器中,追加一个大的 html 字符串比执行多个小的追加要快。因此

 $('ul').append( arrPosts.join( "\n" ) );

应该比

产生更好的结果
  for (i=0;i<arrPosts.length;i++) 
    $('ul').append(arrPosts[i]); 
   

(显然,这种差异只有在添加大量元素时才显着)

【讨论】:

【参考方案3】:

您不必迭代输出。

$('ul').append( arrPosts.join( "\n" ) );

否则看起来不错

【讨论】:

完美运行。我显然需要阅读有关使用 javascript 数组的内容。 ;-)

以上是关于在每次迭代中附加到 dom 或创建一个数组并输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 np.arrays 附加到文件中并稍后将它们用于绘图目的

迭代循环并将列表添加到新行或新列中的数据框

在每次出现特定子字符串时剪切数组中存在的 JS 字符串并附加到同一个数组

如何将每次迭代的输出保存到结构中

如何为附加到元素的每个事件侦听器打印或迭代? [复制]

每次在 MySQL DB 中加载 R 输出