【问题标题】:Select elements by CSS property in JavaScript在 JavaScript 中通过 CSS 属性选择元素
【发布时间】:2012-03-16 20:56:24
【问题描述】:

是否可以通过 CSS 属性选择 DOM 元素?

例如:

awsome_function ({'background-color' : '#0cf'});
// return all object, which's background-color css attribute value is '#0cf'

awsome_function (['background-color']);
// return all object, which has background-color css attribute 

awsome_function (['-my-special-cssattribute'])
// return all object, which has '-my-special-cssattribute' css attribute 

我知道可以使用 jQuery each 方法选择元素,如下所示:

$('*').each(function(){
   if($(this).css('-my-special-cssattribute')) {
      /* do something */
   }
})

但是它可能很慢而且不优雅。有没有更酷的方法来做到这一点?

【问题讨论】:

    标签: javascript jquery css jquery-selectors


    【解决方案1】:

    我会使用自定义选择器:

    $.extend($.expr[":"], {
        foo: function (e) {
            return $(e).css('background-color') == '#0cf';
        }
    });
    

    用法:

    alert($('div:foo').size()); //get the count of all the divs that matches the selector
    

    【讨论】:

    • 我喜欢它。有什么方法可以参数化那个 'foo' 吗?例如 $('div:foo("background-color", "#0cf")')
    • @NagyMárton 我建议将这种逻辑保留在返回所需元素的函数中。如果要添加更多条件,请使用&&
    【解决方案2】:

    Answer : 没有办法做到这一点,而且有充分的理由。 它会很慢,当然比不优雅更糟糕。

    就我个人而言,如果有一天我看到我的一位开发人员这样做,我会杀了他和/或要求我的老板立即更换他。

    使用类或更好的 id !如果不能,则问题出在您的应用程序结构逻辑上。

    【讨论】:

      【解决方案3】:

      但是它可能很慢而且不优雅。有没有更酷的方法来做到这一点?

      速度很慢。这是不雅的。不要那样做。选择带有 ID 或 最终 带有类的元素,但绝不是这样。认真的。

      【讨论】:

      • 应该清楚地指出,通过类和/或 CSS 属性进行选择都会使 jQuery 解析整个 DOM 树。 (在大多数浏览器中)所有 JS 实现都支持的唯一 direct(意味着:快速)选择器是 ID 选择器。
      • 这就是为什么“最终”是斜体的:-)。但对于他的情况,按类选择所有元素将是一个好主意(假设该类添加了背景)。
      • 我同意你的说法,但它没有回答问题。
      • 我认为确实如此。他想做一些非常具体的事情。我回答他绝对不能这样做。
      • 谢谢回答,我只是想创建一个快速的自动 css3 后备库,抱歉没有办法使用类/id。
      【解决方案4】:

      我的建议是用不同的背景颜色附加不同的类。然后你可以选择那些。

      或者你可以试试 .css() http://api.jquery.com/css/

      【讨论】:

      • 感谢答案,但我想对全局后备库使用某种快速过滤。例如,我添加了一个 -spec-border-radius css 属性,它调用一个方法,在任何浏览器中为该对象添加圆角。
      • 我不认为这样做是一个很好的解决方案。 Mozilla、Webkit 和 IE9+ 都有边框半径,如果你想在 IE 8 上使用它,你就必须使用图像。
      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多