文档样式表使用伪选择器获取元素上的所有样式

根据这个答案,我得到了所有的元素样式,

主页.html

<div id="divClass" class="myclass">Text Here</div>

样式文件

#divClass{    
   color:red; 
   background-color:black;
   float:left;
} 

脚本.js

  function copyComputedStyle(a) {
    var sheets = document.styleSheets,
      o = {};
    for (var i in sheets) {
      var rules = sheets[i].rules || sheets[i].cssRules;
      for (var r in rules) {
        if (a.is(rules[r].selectorText)) {
          o = $.extend(o, css2json(rules[r].style), css2json(a.attr('style')));
        }
      }
    }
    return o;
  }

  function css2json(css) {
    var s = {};
    var pattern = /^[1-9][0-9]?$|^100$/;
    if (!css) return s;
    if (css instanceof CSSStyleDeclaration) {
      for (var i in css) {
        if (css[i].toLowerCase) {
          // Some of the key value pairs were vice versa, so try to make them in order!
          // Ex:    0:flex-grow;  0:flex-shrink;  --------> flex-grow: 0; flex-shrink: 0;
          // End
          if (pattern.test(css[i])) {
            s[css[css[i]].toLowerCase()] = css[i];
          } else {
            s[css[i].toLowerCase()] = css[css[i]];
          }
        }
      }
    } else if (typeof css == 'string') {
      css = css.split('; ');
      for (var i in css) {
        var l = css[i].split(': ');
        s[l[0].toLowerCase()] = l[1];
      }
    }
    return s;
  }

console.log(copyComputedStyle($("#divClass")));

它返回一个对象

{
   background-color: "black",
   color: "red",
   float: "left",
   left: ""
}

现在,当我向这个 div添加任何伪选择器hoverbefore和时aftercopyComputedStyle不会记录添加的样式并返回与以前相同的样式!

#divClass{    
   color:red; 
   background-color:black;
   float:left;
}
#divClass:hover{    
   color:blue; 
} 

我怎样才能克服它?

朱利安

问题是在使用时.is(),尤其是当#divClass#divClass: hover

一种解决方案是使用 indexOf 来确保找到与元素 ID 匹配的选择器:

改变这个: if (a.is(rules[r].selectorText)) {

为了这: if (rules[r].selectorText && rules[r].selectorText.indexOf(a.attr('id')) != -1) {

如果您更改代码中的该行,它将返回如下内容:

{
   background-color: "black",
   color: "blue",
   float: "left",
   left: ""
}

这是因为color对象中有重复的属性,而后者占主导地位,我个人会做的是将每个选择器的样式分组的对象:

 function copyComputedStyle(a) {
    var sheets = document.styleSheets,
        o = {},
        objrules = [];

    for (var i in sheets) {
      var rules = sheets[i].rules || sheets[i].cssRules;
      
      for (var r in rules) {
        if (rules[r].selectorText && rules[r].selectorText.indexOf(a.attr('id')) != -1) {
          o = $.extend({},css2json(rules[r].style));
          objrules.push({'selector' : [rules[r].selectorText], 'style' : o});
        }
      }
    }

    return objrules;
  }

  function css2json(css) {
    var s = {};
    var pattern = /^[1-9][0-9]?$|^100$/;

    if (!css) return s;

    if (css instanceof CSSStyleDeclaration) {
      for (var i in css) {
        if (css[i].toLowerCase) {
          // Some of the key value pairs were vice versa, so try to make them in order!
          // Ex:    0:flex-grow;  0:flex-shrink;  --------> flex-grow: 0; flex-shrink: 0;
          // End
          if (pattern.test(css[i])) {
            s[css[css[i]].toLowerCase()] = css[i];
          } else {
            s[css[i].toLowerCase()] = css[css[i]];
          }
        }
      }
    } else if (typeof css == 'string') {
      css = css.split('; ');
      for (var i in css) {
        var l = css[i].split(': ');
        s[l[0].toLowerCase()] = l[1];
      }
    }
    
    return s;
  }

console.log(copyComputedStyle($("#divClass")));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Java禁用元素内的所有样式表

带有 CSS 的样式表之外的选择器

Material-UI中带有样式的伪选择器未呈现到页面

Xslt:如何通过Xslt样式表中的类选择器选择xml元素?

动态更改样式表规则选择器

更改CSS样式表的选择器属性

在Cytoscape选择器样式表中使用代数运算

我是否需要等待样式表加载才能使用 css 选择器?

导入带有javascript的html文件(以及所有样式表和脚本)?

为什么外部有样式表比内部有更好的样式表?除了重用

在Rails中的所有样式表文件中进行Sass变量

在 rails6 开发中禁用加载所有样式表

Python中的正则表达式-在HTML中查找所有样式表

获取所有样式属性颜色

带有样式表(XSL)的CakePHP XmlView

有没有办法使用Apache Tika从文档文件中获取所有样式?

在悬停选择器更改之前获取元素样式

使用 JavaScript 替换 RegEx - 为样式表中的每个 CSS 选择器添加一个父类

尽管样式表中有样式,但文本仍未居中

C ++命名空间中的派生类中的Qt样式表(选择器)

是否可以在外部加载的样式表中修改CSS规则的选择器?

Qt样式表中的“不等于”选择器是什么?

布局中的窗口小部件的哪个样式表选择器?

安装jQuery-UI会丢失所有样式表,我做错了什么?

如何实现附加到此选择元素的所有样式的像素完美对齐?

React 样式元素后代选择器

使用JavaScript更改样式表中没有的类样式(不是单个元素)

在jQuery中选择没有样式的元素

如何清除子元素中的所有样式?