在 JavaScript 中循环遍历所有样式表和类是个好主意吗?
Is looping through all style sheets and classes a good idea in JavaScript?
我有一个JavaScript函数,如下面的代码所示,在 ASP.Net 的WebForms页面中,即在aspx页面中。
该代码实现了我在应用程序中所需的逻辑,即查找 css 类,但我担心如果有很多样式表/类,那么可能会完成太多迭代,从而导致客户端性能降低。
在此代码中,首先获取所有样式表,然后为每个样式表获取所有类,然后迭代以查找给定类。
问:当样式表/类太多时,这种对性能缓慢的担忧是否有效,如果是,是否有更快的方法来使用 JavaScript 找到 css 类?
function getStyle(className) {
var styleSheets = document.styleSheets;
var styleSheetsLength = styleSheets.length;
for (var i = 0; i < styleSheetsLength; i++) {
var classes = styleSheets[i].rules || styleSheets[i].cssRules;
var classesLength = classes.length;
for (var x = 0; x < classesLength; x++) {
if (classes[x].selectorText === undefined) {
continue;
}
if (classes[x].selectorText == className || classes[x].selectorText.indexOf(className) >= 0) {
if (classes[x].cssText) {
return classes[x].cssText;
} else {
return classes[x].style.cssText;
}
}
}
}
}
更新 1
我从我的应用程序中提供了一些代码来说明上述JavaScript方法的使用。我无法控制正在使用哪些类,因为它们来自 ASP.Net 页面中的某些第三方控件。
if ("none" === getStyleAttribute(getStyle(".rwDialog"), "background-image")) {
allDivs[i].style.paddingLeft = "5px";
}
使用很长的时间,我认为通过支持字符串和正则表达式来万无一失,您可以尝试:
function getItem(selector, item, sheet) {
var group = sheet.substr(sheet.indexOf(selector)).match(/{(?:(["'])((?:(?=(?:'')*)''.|.)*?)'1|['s'S])*?}/)[0];
return group.substr(group.indexOf(item)).match(/'s*:'s*((?:(?=(["'])((?:(?=(?:'')*)''.|.)*?)'1).*|.)*?);/)[1].trim();
}
现在把它放在文档的最开头:
function loadStyleSheets(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr.responseText);
}
};
xhr.open("GET", url);
xhr.send();
}
现在:
loadStyleSheets("path/to/style/sheet", function (text) {
alert(getItem('.class1', 'background-image', text));
});
原则上这是一个坏主意,因为它依赖于自定义"解析"。
相反,我建议使用内置的内省方法,例如:
var rwDialogElement = ...;
window.getMatchedCSSRules(rwDialogElement);
相关文章:
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 使用每500ms运行一次的jquery函数是个好主意吗
- 在debounce函数中使用requestAnimationFrame是个好主意吗
- 通过进程使用 NodeJS 全局事件是个好主意吗?
- 将我所有的.js分组到一个文件中-好主意
- 与AMD共享库是个好主意吗
- 模块是打字的好主意吗?或者它们只是增加了复杂性
- 在Coffeescription中使用一个自调用函数来隐藏其余代码中的函数和变量,这是一个好主意吗
- 开发两个单独的节点应用程序来提供 Web 服务和使用 Web 服务以在浏览器上呈现它是一个好主意吗?
- Meteor:为集合服务器端创建筛选器,并将其存储在本地集合中.好主意
- 修改 yii.activeForm 是个好主意吗.js如果不是,另一种方法是什么
- Javascript中的异步类是一个好主意吗?
- 将 with-语句与上下文一起使用是个好主意吗?
- 在 JavaScript 中将小数字合并为一个是个好主意吗?(作为存储优化解决方案)
- 在第一次触摸启动事件时禁用所有点击事件是个好主意吗?
- 我可以定义一个函数来处理在 2 个输入标签上定义的“更改键控”事件吗?这是个好主意吗
- 使用经典继承,在 JavaScript 中使用“类级”/成员变量是一个好主意还是坏主意
- Cron Job是执行此任务的好主意吗?PHP
- 在JS模板中添加逻辑?好主意还是不行
- 在 JavaScript 中循环遍历所有样式表和类是个好主意吗?