+ 前端

JavaScript 对 DOM 变量的整合
2022-05-30

目录:

JavaScript 在操作 DOM 节点时通常需要操作大量的节点,这就会让获取的节点分散在代码的各个角落,于是我尝试着将大部分变量整合起来,用对象{}的属性进行封装,放在代码快的最上方,这样的做法显著的加强了代码的可读性。我把它记录下来,并且探讨这种方法的可行性。

DOM 操作中存在的问题

在获取 DOM 对节点进行更改操作时,我们使用 document.getElementsBy_ 方法后将节点储存在实例化的变量中,这时最基本的操作。 在频繁使用这类语句时,我发现了代码可读性上的问题。变量分布在各个语句中,丢失了原本节点的层次性,而且不利于寻找,或许你会说 Ctrl + f 进行查找,但对大量的代码查找这并不能很好的解决问题,如果变量没有很好的差异性,你需要逐个迭代查找。如果后续需要对特定节点的变量进行修改和寻找,就变得繁琐了起来。

let menu = document.getElementsByClassName("menu")[0];
menu.style.display="none";
...

let search = document.getElementsByClassName("search")[0];
search.style.display="none";
...

let icon = document.getElementsByClassName("fa-menu")[0],
icon.style.display="none";

....

代码的原本逻辑无法改变,但或许我们可以尝试在代码上想点办法。

对节点变量进行整合

首先我把所有节点变量实例化后全部取出,将它们放在了所有语句块的的顶部,这似乎相对解决了我们的困扰,但是不好管理 根据所有节点变量的父节点进行分组,分别存放在同一的对象中,每个节点变量对应一个父节点对象,这很好的符合对象的思维{key:value},节点的层次关系也再次被呈现了出来。

let menu = {
    menu: document.getElementsByClassName("menu")[0],
    search: document.getElementsByClassName("search")[0],
    icon: document.getElementsByClassName("fa-menu")[0],
}

menu.menu.style.display="none";
menu.search.style.display="none";
menu.icon.style.display="none";

上述将节点变量存入了一个对象,这让节点更清晰的展现出来,并且可以更好的将其复用。但是根据 JavaScript 的垃圾回收的引用记数机制,这会带来多余的内存开销,除了最后一个变量外其他变量的回收时间都被相对延长,直到最后一个变量失去引用时才回收对象。

可能存在的问题和解决方法

如果过多的将变量存入对象,最坏的情况下这个对象所占有的内存会一直存在,直到代码结束。因此,不建议将大量的节点变量存入同一个对象,可以适当的进行拆分,尽可能避免内存不能及时回收的问题。

let tag = {
    tags : document.getElementsByClassName("tag-name"),
    icon : document.getElementsByClassName("tag-icon")
    ...
}
let post = {
    list: document.getElementsByClassName("post"),
    date: document.getElementsByClassName("date")
    ...
}

我们也可以在节点变量不再使用时使用 delete 语句对对象中的属性进行删除,使其提前被回收,只不过相对来说这会增加代码行数,并不可取。

let menu = {
    menu: document.getElementsByClassName("menu")[0],
    search: document.getElementsByClassName("search")[0],
    icon: document.getElementsByClassName("fa-menu")[0],
}

menu.menu.style.display="none";
delete menu.menu;
menu.search.style.display="none";
delete menu.search;
menu.icon.style.display="none";

总之,最好选择同一类的引用范围小的代码整合在同一对象中,对于引用范围广的节点变量,请最好单独使用它。

本文作者: Exisi 本文链接: 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。