Обновление 2
Вот хакерское решение, которое может стоить небольшого обнаружения в браузере.Это снижает производительность в моем тестировании до менее чем 1 / 10 того, что было.
Вы можете display='none'
контейнер до добавления, затем показатьэто снова после.Вы можете получить небольшую вспышку, но это, вероятно, лучше, чем длительная задержка.
window.onload = function(){
var content = String.fromCharCode(Math.floor(Math.random() * 1000));
// cache it in case it is already set
var disp = document.body.style.display;
document.body.style.display = 'none';
var now = new Date().getTime();
for(var i = 0; i < 10000; i++){
document.body.appendChild(document.createElement("div"))
.appendChild(document.createTextNode( content ));
}
setTimeout(function(){
console.log(new Date().getTime() - now);
document.body.style.display = disp || ''; // restore it
},0);
};
Такого увеличения производительности я бы ожидал от documentFragment
.
Обновление
После запуска модифицированной версии из @ Esailija jsFiddle для включения documentFragment , в Chrome (или Opera в этом отношении) нет никакой разницы, поэтому кажется, что Chrome просто медленнее.
«Есть ли способ ускорить его?»
Я предполагаю, что вы получите более высокую производительность, если вы используете documentFragment
, а затем добавляете в DOM содин .appendChild
.
window.onload = function(){
var now = new Date().getTime();
// create a documentFragment
var frag = document.createDocumentFragment();
for(var i = 0; i < 10000; i++){
frag.appendChild(Div()); // append to the documentFragment
}
// append the documentFragment (which is emptied)
document.body.appendChild(frag);
setTimeout(function(){
console.log(new Date().getTime() - now);
},0);
function Div(){
var This = document.createElement("div");
return This;
}
}