我需要创建一个流脚本,每秒在不同列中插入1000个元素,当数量达到每列30个元素时,我将删除它们。
我注意到我可以使用CSS来插入我的数据,当我让100个列和每行50行时,DOM元素的数量会减慢。整个过程变得不稳定。
我正在创建元素并存储在数组中以提高性能。
如何在纯JavaScript中以更好的性能执行此任务?
https://jsfiddle.net/r7qpmd4o/4/
<script>
var elems = [],
buffer = 1000,
temp_row,
temp_col,
temp_var;
// run
create();
clock();
function clock() {
setInterval(function() {
for(var i = 0; i < 10; i++) {
temp_col = document.getElementById('col' + i);
temp_row = pop();
if(temp_col.firstChild) {
temp_col.insertBefore(temp_row, temp_col.firstChild);
}
else {
temp_col.appendChild(temp_row);
}
if(temp_col.childNodes.length > 30) {
temp_col.removeChild(temp_col.childNodes[30]);
}
}
}, 1);
}
function pop() {
if(elems.length < 1) {
create();
}
temp_var = elems[elems.length -1];
elems.pop();
return temp_var;
}
function create() {
for(var i = 0; i < buffer; i++) {
temp_row = document.createElement('div');
temp_row.className = 'a';
elems.push(temp_row);
}
console.log('Elems created: ' + buffer);
}
</script>
答案 0 :(得分:1)
<script>
var elems = [],
buffer = 1000,
temp_row,
temp_col,
temp_var;
// run
create();
clock();
var nodeCOunter = 0; //counts what node until 30 hits
function clock() {
setInterval(function() {
for(var i = 0; i < 10; i++) {
temp_col = document.getElementById('col' + i);
temp_row = pop();
if(temp_col.firstChild) {
temp_col.insertBefore(temp_row, temp_col.firstChild);
}
else {
temp_col.appendChild(temp_row);
}
if(nodeCounter == 30){
temp_col.removeChild(temp_col.childNodes[30]);
nodeCounter = 0; //reset
}
else
{
nodeCounter += 1;
}
}, 1);
}
function pop() {
if(elems.length < 1) {
create();
}
temp_var = elems[elems.length -1];
elems.pop();
return temp_var;
}
function create() {
for(var i = 0; i < buffer; i++) {
temp_row = document.createElement('div');
temp_row.className = 'a';
elems.push(temp_row);
}
console.log('Elems created: ' + buffer);
}
答案 1 :(得分:1)
您可以尝试为requestAnimationFrame切换setInterval,然后将create function的内容放在时钟函数的顶部。函数调用非常昂贵。
直播示例:http://codepen.io/larryjoelane/pen/GodmXE
JavaScript的:
var elems = [],
buffer = 1000,
temp_row,
temp_col,
temp_var;
// run
//create();
clock();
function clock() {
//formally part of the create
//function
for(var i = 0; i < buffer; i++) {
temp_row = document.createElement('div');
temp_row.className = 'a';
elems.push(temp_row);
}
console.log('Elems created: ' + buffer);
//end create function
window.requestAnimationFrame(function() {
for(var i = 0; i < 10; i++) {
temp_col = document.getElementById('col' + i);
temp_row = pop();
if(temp_col.firstChild) {
temp_col.insertBefore(temp_row, temp_col.firstChild);
}
else {
temp_col.appendChild(temp_row);
}
if(temp_col.childNodes.length > 30) {
temp_col.removeChild(temp_col.childNodes[30]);
}
}
window.requestAnimationFrame(clock);
});
}
function pop() {
if(elems.length < 1) {
create();
}
temp_var = elems[elems.length -1];
elems.pop();
return temp_var;
}
function create() {
}