javascript - cssRules 无法读取多个样式表类属性值
问题描述
借助这个答案(获取所有 CSS 类背景和颜色属性值),我可以获得所有 CSS 类背景和颜色属性值。当我使用内部 css 代码时它可以工作。
现在,我有超过 35 个外部 CSS 样式表。当我尝试下面的代码时,它只返回第一个外部 CSS 文件输出。无法获取剩余的样式表背景和颜色属性值。如何访问剩余的样式表?
$('#nightMode').on('click', function() {
// var color = $("body").css("background");
// var test = invertColor("#00a3fe");
// console.log(color);
let styles = document.styleSheets;
const rgbToHex = (rgbStr) => !rgbStr ? '':'#' + rgbStr
.slice(4,-1)
.split(', ')
.map(x => (+x).toString(16).padStart(2, '0'))
.join('');
let cssArr =[...styles[0].cssRules].map(x=> ({
class: x.selectorText,
background: rgbToHex(x.style.background),
color: rgbToHex(x.style.color)
} ));
let genCssStr='';
genCssStr+= '<style> \n\n';
cssArr.forEach(x=> genCssStr+=`${x.class}{\n` +
(x.background ? ` background:${invertColor(x.background)};\n` : '') +
(x.color ? ` color:${invertColor(x.color)};\n` : '') + `}\n\n`);
genCssStr+= '</style>';
console.log(styles);
console.log(genCssStr);
$(genCssStr).appendTo("body");
// console.log("array:", JSON.stringify(cssArr));
// console.log("text:\n\n", genCssStr);
});
解决方案
主要问题是您只迭代第一个样式表。您需要迭代所有样式表。另请注意,您不能枚举cssRules
跨域样式表的属性。
以下代码处理所有样式表 (<link rel>
和<style>
) 中的所有 css 规则。try...catch
如果无法访问外部样式表,则添加该块以忽略 DOMExceptions:
var cssArr = [];
[...document.styleSheets].forEach(function(styleSheet) {
var cssRules;
try {
cssRules = styleSheet.cssRules;
} catch (e) {
console.log("Cannot process " + styleSheet.href);
return;
}
[...cssRules].forEach(function(cssRule) {
cssArr.push({
class: cssRule.selectorText,
background: cssRule.style.background,
color: cssRule.style.color
});
});
});
console.log(cssArr);
推荐阅读
- python - 将一本字典总结为另一本
- angular - 强制在 Angular 的路由器之外处理相同的域链接
- python - 分割一个 .yml 文件
- ios - 不允许 iOS mkfifo() 操作
- c - 开罗的笔画对齐
- android - 活动类 {com.android.co.smash/com.android.smash.views.activities.LoginActivity} 不存在
- php - 在 Symfony v4.2 中将带有数据的数组传递给 ChoiceType(html 选择)
- c++ - 重载的运算符不在调试器中工作,但文档说他们应该
- c - 使用字符串键问题的哈希表插入实现
- sql - 面临创建存储过程的麻烦