【问题标题】:Select all node that has certain css-rule without jQuery选择所有没有 jQuery 的具有特定 css-rule 的节点
【发布时间】:2015-02-12 21:14:28
【问题描述】:

如何获取所有具有特定 CSS 规则的节点,例如是否定义:

html {
  color: blue;
}
div.x {
  color: blue;
}

我想获取所有具有color: blue 的节点,我想获取html (document.children[0]) 和所有divclass='x' 节点,而不是所有受该规则影响的子节点.

编辑最终目标是从网站中删除某些 css 规则,我试过这个脚本但在 Chrome 上不起作用:

var xRules = ['userSelect','webkitTouchCallout','webkitUserSelect','khtmlUserSelect','mozUserSelect','msUserSelect'];
var dS = document.styleSheets;
for(var z in dS) {
  var dsz = dS[z].cssRules;
  if(!dsz) continue;
  for(var y in dsz) {
    var dszy = dsz[y].style;
    if(!dszy) continue;
    console.log(dszy.webkitUserSelect);
    for(var x in xRules) {
      var xx = xRules[x];
      dszy.removeProperty(xx);
    }
  }
}

所以我能想到的就是我必须找到元素然后删除样式。

【问题讨论】:

  • 难道你不能有一个名为blue 的类具有该属性,然后将其分配给你的HTML,所以你需要做的就是document.querySelectorAll('.blue')?容易得多。
  • 不,因为我想用javascript来操作别人的网站
  • 什么样的操纵
  • css 操作.. 我需要从每个元素中删除某些 css 规则

标签: javascript css selection


【解决方案1】:

您可以使用document.styleSheets 读取加载的css 规则。然后,找到设置特定属性的规则,在您的情况下为style.color == "blue"

然后,从规则中获取selectorText,它将为您提供选择器。然后使用 document.querySelector() 将获得的选择器作为参数传递来选择元素会很容易。

var classes = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
for (var x = 0; x < classes.length; x++) {
  var cls = classes[x];
  if(cls.style.color == "blue") {
    alert(cls.selectorText);
    
    //Gets a node list of the elements matching the selector
    var elements = document.querySelectorAll(cls.selectorText);
  }
}
html {
  color: blue;
}
div.x {
  color: blue;
}

【讨论】:

    【解决方案2】:

    纯Javascript

    Array.from(document.getElementsByTagName('*')).filter(function(el) {
        return window.getComputedStyle(el).color === 'rgb(0, 0, 0)';
    })
    

    Array.from 目前仅适用于 Firefox,但可以轻松替换为 [].slice.call(...)

    【讨论】:

      【解决方案3】:

      现在这在 css 中是不可能的。但是您可以做的是使用 jquery (javascript) 列出所有元素并检查颜色是否为蓝色。

      $( "*" ).each(function() {
          if ($(this).css("color") === "blue") {
              // do some stuff with $(this)
          }
      });
      

      我不确定它是否会起作用,因为我不知道 jquery 如何返回 css 颜色属性。

      我刚刚注意到你想要没有 jQuery 的解决方案,所以这里是:

      var all = document.getElementsByTagName("*");
      
      for (var i=0, max = all.length; i < max; i++) {
          if (window.getComputedStyle(all[i], null).getPropertyValue("color") === "blue")
              // Do something with the element here
      }
      

      【讨论】:

      • 您建议的不使用 jQuery 的解决方案只有在 CSS 规则在 style 属性上设置内联时才有效,而不是在使用类的地方。
      • 感谢您的通知,我已修复。
      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 2011-01-30
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多