【问题标题】:How to get All Defined CSS Selectors for a given DOM Element?如何获取给定 DOM 元素的所有已定义 CSS 选择器?
【发布时间】:2011-07-05 08:52:48
【问题描述】:

如何使用 jQuery 获取给定 DOM 元素的所有 DEFINED CSS 选择器?

定义的意思是在应用于document的任何样式表中使用的所有CSS选择器。

在某种程度上,这类似于 FireBug 实现的功能,其中显示所选 DOM 元素的所有应用 CSS 选择器。

感谢任何帮助。

【问题讨论】:

  • 这听起来更合理...不过不知道是否可以单独使用 JS/jQuery。
  • your other question 怎么样?它仍然相关吗?
  • 听起来您是在尝试查找元素的计算样式,而不是“定义的选择器”。
  • @Matt Ball:我对计算样式并不完全感兴趣。我有兴趣获得选择器。

标签: javascript jquery css-selectors


【解决方案1】:

我认为这两个功能并不相似。

此外,我认为 jQuery 和浏览器都不会跟踪通过 javascript 代码或样式表文件使用的选择器;选择器用于引用一个或多个 DOM 元素,最终将样式应用于它们。

所以,它保留的是样式,而不是使用的选择器。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    从这个answer 中,您可以通过循环访问 cssRules 属性来获得所需的内容。

    var myElement = $("#content");
    for (var x = 0; x < document.styleSheets.length; x++) {
        var rules = document.styleSheets[x].cssRules;
        for (var i = 0; i < rules.length; i++) {
            if (myElement.is(rules[i].selectorText)) {
                $("ul").append("<li>" + rules[i].selectorText + "</li>");
            }
        }
    }
    

    给定以下 dom:

    <div>
        <div id="content">
        </div>
    </div>
    

    和css规则:

    div
    {
        background-color:black;
    }
    #content{
        height:50px;
        width:50px;
    }
    div > div
    {
        border: solid 1px red;
    }
    

    我们会得到一个匹配的规则集:

    body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form,fieldset, input, textarea, p,
    blockquote, th, td div
    #content 
    div > div
    

    jsfiddle 上的示例。不确定这对所有场景的效果如何,但如果它符合您的需求,可能需要考虑一下。

    更新更完整的example...

    $(document).click(function(event) {
        var rules = GetAppliedCssRules($(event.target));
        var $ul = $("#rules").empty();
        $.each(rules, function() {
            $ul.append("<li>" + this + "</li>");
        });
        event.preventDefault();
    });
    
    function GetAppliedCssRules($element) {
        var appliedRules = [];
        for (var x = 0; x < document.styleSheets.length; x++) {
            var rules = document.styleSheets[x].cssRules;
            for (var i = 0; i < rules.length; i++) {
                if ($element.is(rules[i].selectorText)) {
                    appliedRules.push(rules[i].selectorText);
                }
            }
        }
        return appliedRules;
    }
    

    【讨论】:

    • 这是否像 FireBug 那样按照在 DOM 中应用的优先级顺序返回应用规则?
    • 这不会给您应用规则的优先级,只是样式表中的给定规则与您的元素匹配。如果您想找出元素的最终样式,可以使用getComputedStyle
    • @Mark,你知道如何按 css 优先级排序选择器吗?我看到了按 css 优先级排序的 firebug lite 顺序,但我不知道他们是如何做到的。
    • +1 实现简单、即时可用。 (解决方案的想法在这里很清楚)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多