JavaScript对整个类元素进行有效的样式更改
JavaScript efficient style change on the entire class of elements
在一个非常常见的场景中,我们需要更改整个元素类的样式,我们有一个(简化和通用的)代码,看起来像这样:
var elements = document.getElementsByTagName('div');
for (var i = 0; i < elements.length; i++)
if (elements[i].className == 'HideMe')
elements[i].style.visibility = 'hidden';
它从文档中获取所有的div
元素,循环遍历它们,并将类"HideMe"的可见性更改为"hidden"。另一方面,这段代码:
document.innerHTML.replace(/class="HideMe"/mg, 'class="HideMe" style="visibility: hidden"');
将为所有类为"HideMe"的元素插入不可见样式。我是JavaScript
的新手,不要误会我,但是到目前为止,我看到的每个例子,每个教程都教授第一种方法。难道一个单行程序,一个单一的函数调用,一个由更聪明的人创建的替换算法,不应该比任何一种带有if
语句的循环更快,资源更少吗?这个问题其实更一般,为什么不这样做呢?
document.innerHTML.replace('id="foo"', 'id="bar"');
代替:
document.getElementById('foo').id = 'bar';
检查的代码是完全相同的,但是为了性能,我可能需要让它改变数千个元素的样式,这样我就可以测量任何显著的差异。有什么好的、充分论证的理由来说明为什么我们应该偏爱其中一种方法吗?
Regexp解决方案非常糟糕,永远不应该使用(除非在非常特殊的情况下)。主要原因是您不想替换body
的innerHTML
。在这种情况下,整个 DOM树必须重新构建和重新渲染,这不仅会导致UX滞后和潜在的性能问题,而且更重要的是—丢失所有绑定的事件处理程序。
另一方面,正确使用DOM操作方法可以提供最好的性能和更清晰、更容易阅读的代码。
然而,你提到的第一种方法也不是很好:你应该避免用Javascript改变CSS样式。理想的方法是为元素再添加一个修饰符类,例如:
var elements = document.getElementsByTagName('div');
for (var i = 0; i < elements.length; i++)
if (elements[i].className == 'HideMe')
elements[i].className += ' HideMe-hidden';
// or elements[i].classList.add('HideMe-hidden');
而在CSS中应该是
.HideMe-hidden {
visibility: hidden;
}
这是最灵活最优的解决方案
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 将样式表插入iframe
- 跟踪在页面加载时应用内联样式的JavaScript
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 定义完全独立的样式信息
- 如何有效地将游戏数据存储在URL查询字符串中
- 如何使用Node.js最有效地解析网页
- jquery代码在Mozilla中有效,但在其他浏览器上无效
- 切换样式:只有当样式在HTML中而不是在CSS中时,显示才有效
- SVG 动画在以编程方式设置样式时有效,但在仅使用样式表时无效
- 使用Javascript更改样式的更有效方法
- 如何有效地设置元素中各个字符的样式
- 使用纯javascript设置样式的最有效方法
- 更有效的方式应用交替行样式的GridView在tabcontainer
- JavaScript对整个类元素进行有效的样式更改
- 有效的方式来选择和动态样式长的HTML段落
- 为什么javascript的css样式对第一种情况有效,但对第二种情况无效?
- html样式在Docbook和TEI文档中有效吗
- 是否有更好/有效的解决方案来根据每个数据表单元格的值设置其样式
- 样式表解析器-有效选择器