gpt4 book ai didi

javascript - DOM 中的元素或 Javascript 对象中的元素哪个对性能更好?

转载 作者:搜寻专家 更新时间:2023-10-31 23:24:51 25 4
gpt4 key购买 nike

就性能而言,在 DOM 树中有 20 个元素(及其子元素)还是在 Javascript 对象中存储所有元素更好?

案例一:

<html>
<body>
<div id='el1'>
<span>...</span>
...
</div>
<div id='el2'>
<p>...</p>
...
</div>
<div id='el3'>
<img src="" alt="" />
<br/>
</div>
<div id='el4'>
<section></section>
...
</div>
...
</body>
</html>

案例二:

var OBJ = {};
OBJ.el1 = $("<div id='el1'><span>...</span>...</div>");
OBJ.el2 = $("<div id='el1'><p>...</p>...</div>");
OBJ.el3 = $("<div id='el1'><img src="" alt="" /><br/>...</div>");
OBJ.el4 = $("<div id='el1'><section></section>...</div>");
....

我的应用程序应该一次只显示这些元素之一。如果我将它们留在 DOM 树中并更改它们的样式,它会表现得更好,还是最好将它们存储在 Javascript 对象中并在需要时删除和附加它们?

我如何测试它?

@edit要考虑的额外信息:

1- 所有元素都写在 HTML 文档中,然后在页面加载时删除并存储在 javascript 对象中。

2- 每次事件元素发生变化时,我都会通过删除当前事件元素然后将新元素附加到其中来更改 DOM 结构。

@EDIT 2:经过一些测试

想法是:有人将 HTML 元素写入 DOM,然后 Javascript 必须一次只显示/隐藏这些元素之一。这些元素有自己的 child 。它可以是整页网站或 Web 应用程序。

我创建了 2 个测试用例:

1- 元素将被删除,然后由 Javascript 多次重新附加。因此它们将被存储在一个 Javascript 对象中,直到它被调用

2- 元素将在 DOM 中,我将在需要时隐藏和显示它们(jQuery 函数,但进一步的测试将直接更改 CSS)。

<html>
<head>
<script src='https://code.jquery.com/jquery-1.11.3.min.js'></script>
</head>
<body>
<!-- I USED 15 ELEMENTS IN MY TEST, BUT THE CODE IS TOO LONG -->
<script>
var OBJ1 = {};
var OBJ2 = new Array();
var ACTIVE;
var BODY = $(document.body);
var T1, T2, DELTA;

$(function(){
T1 = new Date().getTime();
/*
//TEST 1: Javascript
var _this,id;
$('div').each(function(){
_this = $(this);
id = _this.attr('id');
OBJ1[id] = _this;
_this.remove();
});

var c;
for (var i = 0; i < 10000; i++) {
for(var k in OBJ1){
c = OBJ1[k];
if(ACTIVE) ACTIVE.remove();
BODY.append(c);
ACTIVE = c;
}
}*/

//TEST 2: DOM
var _this,id;
$('div').each(function(){
_this = $(this);
id = _this.attr('id');
OBJ2.push(id);
});

var c;
for (var i = 0; i < 10000; i++) {
for(var k=0,l=OBJ2.length;k<l;k++){
c = $('#'+OBJ2[k]);
if(ACTIVE) ACTIVE.hide();
c.show();
ACTIVE = c;
}
}

T2 = new Date().getTime();
DELTA = T2 - T1;
console.log('It took '+DELTA+' milliseconds');
});
</script>
</body>

我用一些 Lorem Ipsum 和 Lorem Pixel 内容创建了 5 个通用元素,并将它们复制/粘贴了 3 次,从而制作了 15 个一级元素。

我隐藏和显示 15 种元素中的每一种元素 1000 次。每次运行测试 3 次。

案例 1 (迄今为止获胜者):5.2 秒、4.75 秒、4.85 秒

案例2:21.5s、21.5s、20s

@edit 3:更改案例 2 方法

将第二种情况从 hide()/show() 更改为 css() 可显着提高性能。

//TEST 2: DOM
var _this,id;
$('div').each(function(){
_this = $(this);
_this.css('display','none');
id = _this.attr('id');
OBJ2.push(id);
});

var c;
for (var i = 0; i < 15000; i++) {
for(var k=0,l=OBJ2.length;k<l;k++){
c = $('#'+OBJ2[k]);
if(ACTIVE) ACTIVE.css('display','none');
c.css('display','block');
ACTIVE = c;
}
}

还将循环增加到 15k。

案例 1:大约 6.5 秒

案例 2:大约 2.5 秒

最佳答案

肯定留在DOM树中。我只会使用显示/隐藏方法来显示您想要的方法。

如果有一个应该反射(reflect)在元素中的动态变化值,我只会使用 JS 方法,但如果它们都是静态的,则更改 DOM 树的性能要高得多,而不仅仅是 CSS 样式更改。

您可以通过编写两者来测试这一点,然后使用 jsperf 进行比较。

关于javascript - DOM 中的元素或 Javascript 对象中的元素哪个对性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com