Javascript,CSS:通过样式属性获取元素

Posted

技术标签:

【中文标题】Javascript,CSS:通过样式属性获取元素【英文标题】:Javascript, CSS: Get element by style attribute 【发布时间】:2012-06-01 19:41:23 【问题描述】:

我想:

    查找页面中所有元素的样式属性(例如:所有具有color:#333; 的元素) 为所有这些更改此属性(例如,从 color:#333 更改为 color:#444)。

您对此有什么建议吗?

【问题讨论】:

为什么不为所有这些元素添加一个(另一个)类? :) 我不能,因为脚本是 Chrome 扩展的一部分 依靠一个css属性来查找元素确实不是个好主意。即使使用像 jQuery 这样的框架,您也需要解析大量代码。 是的,但是某些扩展不会费心将所有废话添加到输入中,有时会破坏设计,除了查找某些扩展添加的内容并修复它之外别无选择 【参考方案1】:

我的建议是尽可能避免这样做。相反,使用一个类来分配颜色值,然后您可以使用该类而不是颜色值来查找元素。

据我所知,没有可用于查询 特定 样式值的选择器(即使在 CSS3 中也没有),这意味着循环遍历所有元素(或者看起来像可以将其限制为具有style 属性的所有元素)并查看element.style.color 属性。现在,问题是,即使你在style 属性中写了color: #333;,不同的浏览器也会以不同的方式回显给你。可能是#333,可能是#333333,可能是rgb(51, 51, 51),甚至可能是rgba(51, 51, 51, 0)

所以总的来说,确实是一个非常尴尬的练习。


既然您说这是针对 Chrome 扩展程序,您可能不必担心多种格式,尽管我会加入我们在野外看到的格式,以防 Chrome 更改格式(可能与其他一些已知会发生的浏览器一致)。

例如:

(function() 

  // Get all elements that have a style attribute
  var elms = document.querySelectorAll("*[style]");

  // Loop through them
  Array.prototype.forEach.call(elms, function(elm) 
    // Get the color value
    var clr = elm.style.color || "";

    // Remove all whitespace, make it all lower case
    clr = clr.replace(/\s/g, "").toLowerCase();

    // Switch on the possible values we know of
    switch (clr) 
      case "#333":
      case "#333333":
      case "rgb(51,51,51)": // <=== This is the one Chrome seems to use
      case "rgba(51,51,51,0)":
        elm.style.color = "#444";
        break;
    
  );
)();

Live example using red for clarity | source - 请注意,该示例依赖于 ES5 功能和 querySelectorAll,但由于这是 Chrome,我知道它们在那里。

请注意,以上假设为内联样式,因为您谈到了style 属性。如果您的意思是 computed 样式,那么除了在调用 getComputedStyle 的页面上循环遍历 all 元素之外别无他法。除此之外,以上适用。

最后说明:如果您的真正意思是样式属性的值恰好是 color: #333 而不是值 color:#333color:#333333;color: #333; font-weight: bold 或任何其他字符串,您的 querySelectorAll 可以处理:@987654341 @。但它会非常脆弱。


从您下面的评论中,听起来您必须遍历 每个 元素。如果是这样,我根本不会使用querySelectorAll,我会使用递归下降:

function walk(elm) 
    var node;

    // ...handle this element's `style` or `getComputedStyle`...

    // Handle child elements
    for (node = elm.firstChild; node; node = node.nextSibling) 
        if (node.nodeType === 1)  // 1 == Element
            walk(node);
        
    


// Kick it off starting with the `body` element
walk(document.body);

这样您就不会建造大型、不必要的临时结构。这可能是遍历文档的整个 DOM 的最有效方式。

【讨论】:

好吧,浏览器应该在内部将所有这些颜色转换为一致的格式,因此如果您正在扫描 DOM,则不需要寻找多个颜色。 @Spudley:如果您针对多个浏览器,您会这样做,这就是我提出它的原因。但是现在 OP 说这是一个 Chrome 扩展,它简化了事情。当然,如果 Chrome 不会将其从 dot 版本更改为 dot 版本,他们可以很好地与其他浏览器保持一致... 非常感谢@T.J.Crowder,我实际上需要遍历所有元素。我正在尝试但没有成功:// Get all elements that have a style attribute var elms = document.querySelectorAll(""); // Loop through them Array.prototype.forEach.call(elms, function(elm) // Get the color value var crs = getComputedStyle(elm, ':after').getPropertyCSSValue('color'); alert(crs); @silviolor:听起来你已经解决了(我假设,因为你接受了答案),但是如果你必须走 all 元素,我不会使用querySelectorAll。请参阅更新答案的最后。【参考方案2】:

如果您不向要跟踪的所有这些元素添加至少一个特定的 CSS 类,则不能。

或者更好的是,您可以通过循环 DOM 的所有元素直到找到您要查找的内容来获得非常差的性能。 但是请不要考虑这样做

【讨论】:

【参考方案3】:

如果你使用 jquery 肯定会更简单。 无论如何,最好的办法是使用类并使用filter jquery method 来获取您想要的对象。

但如果你真的想得到它们,你可以这样做:

$(function () 
    $('p').filter(function () 
        return $(this).css('color') == '#333';
    ).css('color', '#444');
);

上述脚本获取具有所需 css 属性的元素并设置新的 css 属性(颜色 #444)。

【讨论】:

我同意你的观点,使用 jquery 只是一个建议。 B 也是一个合理的评论,即使扭转这种变化非常简单。关于C,我不同意。对我来说,一个庞大的数组就像一个 10000 个元素的数组,而包含 10000 个元素的页面是非常不寻常的......【参考方案4】:

如前所述,按颜色查询所有元素非常困难/效率低下。

// refrence: http://***.com/questions/5999209/jquery-how-to-get-the-background-color-code-of-an-element
var arr = [];

$('*').each(function (i, ele) 
   // is red => save
   if($(ele).css('backgroundColor') == ('rgb(0, 0, 255)')) arr.push(ele);
);

console.log(arr);

这是一个 JSFiddle 示例:http://jsfiddle.net/ddAg7/

我的建议是:不要这样做!

【讨论】:

【参考方案5】:

类似

$('selector').each(function() 
    if($(this).attr('style').indexOf('font-weight') > -1) 
        alert('得到了我的属性');
    
);

在 if 语句中,您可以用不同的 css 替换它...不确定.. 尚未在所有浏览器上尝试过 :)

【讨论】:

以上是关于Javascript,CSS:通过样式属性获取元素的主要内容,如果未能解决你的问题,请参考以下文章

如何用JavaScript去操作HTML元素和CSS样式

JavaScript之DOM改变HTML的样式

JQuery快速入门-操作元素的属性和样式

通过 jQuery/Javascript 添加悬停 CSS 属性

day26—JavaScript对CSS样式的获取和修改实践

原生JavaScript获取css样式