我不确定这是你想要的,它最接近你的第一个伪代码,你有一个元素实例,无论如何希望它有帮助:
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 函数和matchSelector,因此在旧浏览器中没有 shims 将无法工作。另外,您还可以按优先级等进行过滤 - 例如,您可以删除所有优先级低于内联样式的属性等。