检测样式是否为用户样式
Detecting if a style is a user style
调用window.getComputedStyle
后,如何判断样式是否来自页面本身(而不是来自浏览器(?我对纯javascript感兴趣,尽管我会满足于在附加组件上下文中运行的解决方案。
你将很难弄清楚getComputedStyle
给你的规则来自哪里。请注意,MaxArt 提供的代码不是一个完整的解决方案 - 也有继承的样式,因此必须为父节点重复所有内容。更简单的方法是使用 inIDOMUtils.getCSSStyleRules()
,按照以下思路:
function isPageStyle(styleSheet)
{
if (styleSheet.ownerNode)
return true;
if (styleSheet.ownerRule instanceof Components.interfaces.nsIDOMCSSImportRule)
return isPageStyle(styleSheet.parentStyleSheet);
return false;
}
var domUtils = Components.classes["@mozilla.org/inspector/dom-utils;1"]
.getService(Components.interfaces.inIDOMUtils);
var rules = domUtils.getCSSStyleRules(element);
for (var i = 0; i < rules.Count(); i++)
{
var rule = rules.GetElementAt(i);
if (isPageStyle(rule.parentStyleSheet))
alert(rule.cssText);
}
您还必须为父节点执行此操作。有关完整的示例,您可以查看Firefox中检查器功能的实现(我的回答中的isPageStyle
功能无耻地从这里"借用"(。
除非你想解析文档中的每个样式表,否则你不能。如果您对默认情况下每个浏览器应用于元素的样式有疑问,您可以依靠类似 重置 CSS 的东西。
如果你想解析样式表,无论如何,你可以做这样的事情:
function isDefaultStyle(element, property) {
if (element.style[property]) return false;
for (var i = 0; i < document.styleSheets.length; i++) {
for (var j = 0, r; j < document.styleSheets[i].cssRules.length; j++) {
r = document.styleSheets[i].cssRules[j];
if (element.matchesSelector(r.selectorText) && r[property]) return false;
}
}
return true;
}
matchesSelector
是一种元素方法,实际上没有任何浏览器支持,它实际上支持命名空间函数,如 webkitMatchesSelector
、mozMatchesSelector
、oMatchesSelector
甚至msMatchesSelector
(IE9+(。可悲的是,对于IE8,您必须模拟它,我找不到比检查元素是否包含在document.querySelectorAll(r.selectorText)
中更好的方法,这对于大型DOM树来说可能非常慢。
在最后一种情况下,您显然也必须使用 rules
而不是 cssRules
.
相关文章:
- 将用户对样式表的选择保存在cookie中
- 根据用户输入声明样式设置
- 如何让用户更改表单的样式元素
- JavaScript样式警报,在用户导航离开页面之前带有链接
- 更改网站的样式代码以允许用户更改大小和样式不起作用
- 从用户输入向元素添加样式
- 检测样式是否为用户样式
- 将用户输入传递给 XSL 样式表
- 沙盒,用于保护允许用户上传样式的网站
- 根据用户是否投票设置布局样式
- 根据本地机器上的用户时间戳更改样式表.Javascript解决方案
- 记住用户在导航到不同页面时选择了哪个样式表
- MVC -当用户到达或离开主页时添加/删除样式
- 如何让用户保存自定义样式表设置
- 检测用户的操作系统并重新排列/样式下载链接
- 根据用户代理更改样式表
- AngularJS根据用户输入切换样式表
- 如果用户使用带有锚/哈希的链接访问网站,我如何将样式应用于元素
- Ruby on Rails:如何允许用户在表单上设置文本样式
- 从用户样式表中注入css,不带过渡