是否可以使用Javascript检查样式标记中是否定义了某些CSS属性?

是否可以使用Javascript检查样式标记中是否定义了某些CSS属性?,javascript,css,styles,Javascript,Css,Styles,我正在编写一个脚本,需要检查标记中是否定义了某些CSS属性 #条{宽度:200px;} foo 酒吧 /200px log(document.getElementById(“foo”).style.width); //空字符串 log(document.getElementById(“bar”).style.width); if(属性\u宽度\u定义的\u样式\u标记){ // ... } 这可能吗 我不想得到getComputedStyle(ele).widthbtw.您可以在java

我正在编写一个脚本,需要检查
标记中是否定义了某些CSS属性


#条{宽度:200px;}
foo
酒吧
/200px
log(document.getElementById(“foo”).style.width);
//空字符串
log(document.getElementById(“bar”).style.width);
if(属性\u宽度\u定义的\u样式\u标记){
// ...
}
这可能吗


我不想得到
getComputedStyle(ele).width
btw.

您可以在javascript中完全探索


document.styleSheets
数组开始。这些值是您的文档使用的不同样式元素或CSS文件。

我不确定这是否是您想要的,它最接近您的第一个伪代码,您有一个元素实例,无论如何希望它有帮助:

var proto = Element.prototype;
var slice = Function.call.bind(Array.prototype.slice);
var matches = Function.call.bind(proto.matchesSelector || 
                proto.mozMatchesSelector || proto.webkitMatchesSelector ||
                proto.msMatchesSelector || proto.oMatchesSelector);

// Returns true if a DOM Element matches a cssRule
var elementMatchCSSRule = function(element, cssRule) {
  return matches(element, cssRule.selectorText);
};

// Returns true if a property is defined in a cssRule
var propertyInCSSRule = function(prop, cssRule) {
  return prop in cssRule.style && cssRule.style[prop] !== "";
};

// Here we get the cssRules across all the stylesheets in one array
var cssRules = slice(document.styleSheets).reduce(function(rules, styleSheet) {
  return rules.concat(slice(styleSheet.cssRules));
}, []);

// get a reference to an element, then...
var bar = document.getElementById("bar");

// get only the css rules that matches that element
var elementRules = cssRules.filter(elementMatchCSSRule.bind(null, bar));

// check if the property "width" is in one of those rules
hasWidth = elementRules.some(propertyInCSSRule.bind(null, "width"));
我认为您可以出于自己的目的重用所有这些代码,或者只是其中的一部分,它是模块化的——例如,一旦您拥有了所有的
cssRules
flatten或
elementRules
,您仍然可以使用
for
循环并检查您需要的内容。
它使用ES5函数,因此在旧浏览器中,如果没有垫片就无法工作。此外,您还可以按优先级进行筛选,等等–例如,您可以删除优先级低于内联样式的所有属性。

“我不想获取getComputedStyle(ele).width btw。”然而,您的代码示例表明,这正是您要做的。如果不是,您想做什么?我想从#栏中获取一些字符串(本例中为200px),而不是“一个空字符串”,因为样式是在样式标记中定义的。@user:
getComputedStyle
会这样做。Crowder,请阅读标题,这正是我想做的
getComputedStyle
肯定会返回一些实际值,但您无法从样式标记或内联样式判断样式的定义位置@dystroy的建议可能是解决方案。@用户:我看到了标题。你需要明白人们总是说X,意思是Y。是的,当然,如果您认为这是最好的方法,请查看样式表。另一种可能是将
样式
对象与
getComputedStyle
的返回值进行比较。我正在查看文档……似乎我必须在每个样式表上执行正则表达式。一个小的修正…
文档。样式表
,大写的
S
用于
表单
。为什么要使用正则表达式?我当然不需要正则表达式。这是我在控制台log
document.styleSheets
时的第一个想法。问题已解决,问题已更新。谢谢,谢谢你的样式表提示。我发现ZER0的解决方案正是我所需要的。所以我选择他的答案作为接受。很抱歉。ZER0,我还是不太明白你的代码是如何工作的。但是,这正是我想要的。最好的部分是它在
parent-child{prop:val}
上工作,其中child是元素标记名,而不是类或id选择器。答案是肯定的。非常感谢。我试图在代码中添加一些有意义的注释,但是如果有一些部分您希望得到更好的解释,请告诉我。很高兴这就是你要找的代码!我在这里更新了您的代码的修改版本:也许您会想看看@TakitIsy嘿,谢谢!很高兴看到它仍然被使用并且很有用。:)