【问题标题】:JavaScript performance while generating too many elements生成过多元素时的 JavaScript 性能
【发布时间】:2013-07-29 02:23:36
【问题描述】:

哪个更快,为什么?

1.

for(var i=0; i<1000; i++)
    document.getElementById('parent').innerHTML += 
            '<input id="id_'+i+'" type="checkbox" value="'+i+'" /><label for="id_'+i+'">'+i+'</label>';

2.

for(var i=0; i<1000; i++){
    var cb = document.createElement('input');
    cb.type = 'checkbox';    
    cb.id = 'id_'+i;
    cb.value = i;

    var l = document.createElement('label');
    l.htmlFor = 'id_'+i;
    l.appendChild(document.createTextNode(i.toString()));

    parentElement.appendChild(cb);
    parentElement.appendChild(l);
}

有没有更有效的方法?

【问题讨论】:

  • @Nirk 感谢您的编辑 :)

标签: javascript performance


【解决方案1】:

这将比两者中的任何一个都快,因为它只更新 DOM 一次

for(var i=0, HTML=""; i<1000; i++)
  HTML += '<input id="id_'+i+'" type="checkbox" value="'+i+'" /><label for="id_'+i+'">'+i+'</label>';
document.getElementById('parent').innerHTML = HTML;

http://jsperf.com/create-append-vs-fragment-append-vs-assign 可能会显示一些有趣的东西

Fragment 和 appendChild 在我的 ipad 上慢了 98%

【讨论】:

    【解决方案2】:

    最快的方法是创建DocumentFragment,如下:

    var fragment = document.createDocumentFragment();
    
    for (var i = 0; i < 1000; i++) {
        var id = "id_" + i;
    
        var checkbox = document.createElement("input");
        checkbox.setAttribute("type", "checkbox");
        checkbox.setAttribute("value", i);
        checkbox.setAttribute("name", id);              // labels are used with names
        checkbox.setAttribute("id", id);
    
        var label = document.createElement("label");
        label.setAttribute("for", id);
        label.innerHTML = i;
    
        fragment.appendChild(checkbox);
        fragment.appendChild(label);
    }
    
    document.getElementById("parent").appendChild(fragment);
    

    它为您提供两全其美的体验。

    【讨论】:

    • 这不再是真的。我没有 jsperf 链接了,但我大约在一年前测试了这个。多年来,我一直是 documentFragment 方法的忠实拥护者,并且非常惊讶地发现,现在每个现代浏览器中字符串上的 innerHTML 都与旧的组合方法一样快或更快。
    • 我想知道克隆和 id 更改是否也会比这更快
    • @Geuis 假设性能设置正确,这个说片段更快:jsperf.com/appendchild-vs-documentfragment-vs-innerhtml/31
    • 非常有趣!该死的,我希望我仍然有我设置的测试来比较。
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2018-07-26
    • 2012-03-17
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多