Tìm tất cả các quy tắc CSS áp dụng cho một phần tử


87

Nhiều công cụ / API cung cấp các cách chọn phần tử của các lớp hoặc ID cụ thể. Cũng có thể kiểm tra các bảng định kiểu thô được tải bởi trình duyệt.

Tuy nhiên, để các trình duyệt hiển thị một phần tử, chúng sẽ biên dịch tất cả các quy tắc CSS (có thể từ các tệp biểu định kiểu khác nhau) và áp dụng nó cho phần tử. Đây là những gì bạn thấy với Firebug hoặc WebKit Inspector - cây kế thừa CSS đầy đủ cho một phần tử.

Làm cách nào để tôi có thể tái tạo tính năng này bằng JavaScript thuần túy mà không yêu cầu bổ sung plugin trình duyệt?

Có lẽ một ví dụ có thể cung cấp một số làm rõ cho những gì tôi đang tìm kiếm:

<style type="text/css">
    p { color :red; }
    #description { font-size: 20px; }
</style>

<p id="description">Lorem ipsum</p>

Ở đây, phần tử mô tả p # có áp dụng hai quy tắc CSS: màu đỏ và kích thước phông chữ là 20 px.

Tôi muốn tìm nguồn từ nơi các quy tắc CSS được tính toán này bắt nguồn từ (màu sắc là quy tắc p, v.v.).



Xem trong trình duyệt và sử dụng các công cụ dành cho nhà phát triển trình duyệt (ví dụ: tab Phần tử trong Chrome)?
Ronnie Royston

Câu trả lời:


77

Vì câu hỏi này hiện không có câu trả lời nhẹ (không phải thư viện), tương thích với nhiều trình duyệt, tôi sẽ cố gắng cung cấp một câu trả lời:

function css(el) {
    var sheets = document.styleSheets, ret = [];
    el.matches = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector 
        || el.msMatchesSelector || el.oMatchesSelector;
    for (var i in sheets) {
        var rules = sheets[i].rules || sheets[i].cssRules;
        for (var r in rules) {
            if (el.matches(rules[r].selectorText)) {
                ret.push(rules[r].cssText);
            }
        }
    }
    return ret;
}

JSFiddle: http://jsfiddle.net/HP326/6/

Việc gọi css(document.getElementById('elementId'))sẽ trả về một mảng có một phần tử cho mỗi quy tắc CSS khớp với phần tử được truyền vào. Nếu bạn muốn tìm hiểu thêm thông tin cụ thể về từng quy tắc, hãy xem tài liệu về đối tượng CSSRule .


1
a.matchesđược định nghĩa trong dòng này: a.matches = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.msMatchesSelector || a.oMatchesSelector. Nó có nghĩa là, nếu đã có một phương thức (chuẩn) "so khớp" cho các Nút DOM, nó sẽ sử dụng phương thức đó, nếu không nó sẽ cố gắng sử dụng phương thức cụ thể của Webkit (webkitMatchesSelector), sau đó là các phương pháp của Mozilla, Microsoft và Opera. Bạn có thể đọc thêm về nó tại đây: developer.mozilla.org/en/docs/Web/API/Element/matches
SB

3
Thật không may, tôi nghĩ rằng giải pháp thay thế này không phát hiện tất cả các quy tắc CSS phân tầng từ các phần tử mẹ ở phần con. Fiddle: jsfiddle.net/t554xo2L Trong trường hợp này, quy tắc UL (áp dụng cho phần tử) không phù hợp với if (a.matches(rules[r].selectorText))điều kiện canh gác.
funforums

2
Tôi chưa bao giờ tuyên bố rằng nó đã liệt kê / kế thừa / các quy tắc CSS - tất cả những gì nó làm là liệt kê các quy tắc CSS phù hợp với phần tử đã truyền. Nếu bạn cũng muốn nhận các quy tắc kế thừa cho phần tử đó, có thể bạn cần phải duyệt DOM trở lên và gọi css()từng phần tử mẹ.
SB

2
Tôi biết :-) Tôi chỉ muốn chỉ ra điều này vì những người có thể xem xét câu hỏi này có thể cho rằng nó nhận được 'tất cả các quy tắc css áp dụng cho một phần tử', như tiêu đề của câu hỏi, đó không phải là trường hợp .
funforums

3
Nếu bạn muốn tất cả các quy tắc hiện được áp dụng cho phần tử bao gồm cả các quy tắc được kế thừa, bạn nên sử dụng getComputedStyle. Do đó, tôi nghĩ câu trả lời này là đúng và đúng khi không bao gồm các kiểu được thừa hưởng từ cha mẹ (ví dụ: màu văn bản được gán cho cha mẹ). Tuy nhiên, những gì nó không bao gồm là các quy tắc được áp dụng có điều kiện với các truy vấn phương tiện.
run rẩy vào

23

CHỈNH SỬA: Câu trả lời này hiện không được dùng nữa và không còn hoạt động trong Chrome 64+ . Để lại cho bối cảnh lịch sử. Trên thực tế, báo cáo lỗi liên kết trở lại câu hỏi này để có các giải pháp thay thế cho việc sử dụng điều này.


Có vẻ như tôi đã tự trả lời được câu hỏi của mình sau một giờ nghiên cứu nữa.

Nó đơn giản như sau:

window.getMatchedCSSRules(document.getElementById("description"))

(Hoạt động trong WebKit / Chrome, có thể cả những người khác)


4
Điều này sẽ không được sử dụng nhiều nếu nó chỉ được hỗ trợ bởi chrome. Nó sẽ hoạt động với ít hơn 5% tổng số khách truy cập (tùy thuộc vào nhân khẩu học).
Tomasi

5
@diamandiev: Tính đến tháng 6 năm 2012, tỷ lệ sử dụng Chrome đã tăng lên hơn 32% (và cao hơn một chút so với mức sử dụng IE!). gs.statcounter.com
Roy Tinker

6
getMatchCSSRules KHÔNG hiển thị cho bạn các kiểu cuối cùng áp dụng cho phần tử. Nó trả về một mảng của tất cả các đối tượng CSSStyleRule áp dụng theo thứ tự mà chúng xuất hiện. Nếu bạn thiết kế web đáp ứng thông qua các truy vấn phương tiện CSS hoặc tải nhiều hơn một biểu định kiểu (như một biểu định kiểu cho IE), bạn vẫn cần phải lặp lại từng kiểu được trả về và tính toán đặc trưng css cho từng quy tắc. Sau đó, tính toán các quy tắc cuối cùng áp dụng. Bạn cần tái tạo những gì trình duyệt làm một cách tự nhiên. Để chứng minh điều này trong ví dụ của bạn, hãy thêm "p {color: blue! Important}" vào đầu phần khai báo kiểu của bạn.
mrbinky3000

24
Tính năng này hiện không được dùng nữa trong Chrome 41. Hãy xem code.google.com/p/chromium/issues/detail?id=437569#c2 .
Daniel Darabos

5
Đây cuối cùng đã được gỡ bỏ trong Chrome 63 (bài viết trên blog chính thức - mà điểm sao cho câu hỏi này)
brichins

19

Hãy xem thư viện này, thư viện này thực hiện những gì được yêu cầu: http://www.brothercake.com/site/resources/scripts/cssutilities/

Nó hoạt động trong tất cả các trình duyệt hiện đại ngay từ IE6, có thể cung cấp cho bạn các bộ sưu tập quy tắc và thuộc tính như Firebug (thực tế là nó chính xác hơn Firebug) và cũng có thể tính toán tính cụ thể tương đối hoặc tuyệt đối của bất kỳ quy tắc nào. Cảnh báo duy nhất là, mặc dù nó hiểu các loại phương tiện tĩnh, nhưng nó không hiểu các truy vấn phương tiện.


Module này thực sự rất tuyệt, chỉ mong nó được tác giả yêu thích hơn.
mr1031011

18

Phiên bản ngắn ngày 12 tháng 4 năm 2017

Kẻ thách thức xuất hiện.

var getMatchedCSSRules = (el, css = el.ownerDocument.styleSheets) => 
    [].concat(...[...css].map(s => [...s.cssRules||[]])) /* 1 */
    .filter(r => el.matches(r.selectorText));            /* 2 */

Line /* 1 */xây dựng một mảng phẳng của tất cả các quy tắc.
Dòng /* 2 */loại bỏ các quy tắc không phù hợp.

Dựa trên chức năngcss(el) của @SB trên cùng một trang.

ví dụ 1

var div = iframedoc.querySelector("#myelement");
var rules = getMatchedCSSRules(div, iframedoc.styleSheets);
console.log(rules[0].parentStyleSheet.ownerNode, rules[0].cssText);

Ví dụ 2

var getMatchedCSSRules = (el, css = el.ownerDocument.styleSheets) => 
    [].concat(...[...css].map(s => [...s.cssRules||[]]))
    .filter(r => el.matches(r.selectorText));

function Go(big,show) {
    var r = getMatchedCSSRules(big);
PrintInfo:
    var f = (dd,rr,ee="\n") => dd + rr.cssText.slice(0,50) + ee;
    show.value += "--------------- Rules: ----------------\n";
    show.value += f("Rule 1:   ", r[0]);
    show.value += f("Rule 2:   ", r[1]);
    show.value += f("Inline:   ", big.style);
    show.value += f("Computed: ", getComputedStyle(big), "(…)\n");
    show.value += "-------- Style element (HTML): --------\n";
    show.value += r[0].parentStyleSheet.ownerNode.outerHTML;
}

Go(...document.querySelectorAll("#big,#show"));
.red {color: red;}
#big {font-size: 20px;}
<h3 id="big" class="red" style="margin: 0">Lorem ipsum</h3>
<textarea id="show" cols="70" rows="10"></textarea>

Thiếu sót

  • Không xử lý phương tiện truyền thông, không @import, @media.
  • Không có quyền truy cập vào các kiểu được tải từ các bảng định kiểu miền chéo.
  • Không phân loại theo bộ chọn “tính cụ thể” (thứ tự quan trọng).
  • Không có phong cách kế thừa từ cha mẹ.
  • Có thể không hoạt động với các trình duyệt cũ hoặc thô sơ.
  • Không chắc nó đối phó với lớp giả và bộ chọn giả như thế nào nhưng có vẻ ổn.

Có lẽ một ngày nào đó tôi sẽ giải quyết những thiếu sót này.

Phiên bản dài ngày 12 tháng 8 năm 2018

Đây là cách triển khai toàn diện hơn nhiều được lấy từ trang GitHub của ai đó (được tách từ mã gốc này , thông qua Bugzilla ). Được viết cho Gecko và IE, nhưng được cho là cũng hoạt động với Blink.

Ngày 4 tháng 5 năm 2017: Máy tính độ cụ thể đã có một số lỗi nghiêm trọng mà tôi hiện đã sửa. (Tôi không thể thông báo cho các tác giả vì tôi không có tài khoản GitHub.)

Ngày 12 tháng 8 năm 2018: Các bản cập nhật Chrome gần đây dường như đã tách phạm vi đối tượng ( this) khỏi các phương thức được gán cho các biến độc lập. Do đó, lệnh gọi matcher(selector)đã ngừng hoạt động. Thay thế nó bằng matcher.call(el, selector)đã giải quyết nó.

// polyfill window.getMatchedCSSRules() in FireFox 6+
if (typeof window.getMatchedCSSRules !== 'function') {
    var ELEMENT_RE = /[\w-]+/g,
            ID_RE = /#[\w-]+/g,
            CLASS_RE = /\.[\w-]+/g,
            ATTR_RE = /\[[^\]]+\]/g,
            // :not() pseudo-class does not add to specificity, but its content does as if it was outside it
            PSEUDO_CLASSES_RE = /\:(?!not)[\w-]+(\(.*\))?/g,
            PSEUDO_ELEMENTS_RE = /\:\:?(after|before|first-letter|first-line|selection)/g;
        // convert an array-like object to array
        function toArray(list) {
            return [].slice.call(list);
        }

        // handles extraction of `cssRules` as an `Array` from a stylesheet or something that behaves the same
        function getSheetRules(stylesheet) {
            var sheet_media = stylesheet.media && stylesheet.media.mediaText;
            // if this sheet is disabled skip it
            if ( stylesheet.disabled ) return [];
            // if this sheet's media is specified and doesn't match the viewport then skip it
            if ( sheet_media && sheet_media.length && ! window.matchMedia(sheet_media).matches ) return [];
            // get the style rules of this sheet
            return toArray(stylesheet.cssRules);
        }

        function _find(string, re) {
            var matches = string.match(re);
            return matches ? matches.length : 0;
        }

        // calculates the specificity of a given `selector`
        function calculateScore(selector) {
            var score = [0,0,0],
                parts = selector.split(' '),
                part, match;
            //TODO: clean the ':not' part since the last ELEMENT_RE will pick it up
            while (part = parts.shift(), typeof part == 'string') {
                // find all pseudo-elements
                match = _find(part, PSEUDO_ELEMENTS_RE);
                score[2] += match;
                // and remove them
                match && (part = part.replace(PSEUDO_ELEMENTS_RE, ''));
                // find all pseudo-classes
                match = _find(part, PSEUDO_CLASSES_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(PSEUDO_CLASSES_RE, ''));
                // find all attributes
                match = _find(part, ATTR_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(ATTR_RE, ''));
                // find all IDs
                match = _find(part, ID_RE);
                score[0] += match;
                // and remove them
                match && (part = part.replace(ID_RE, ''));
                // find all classes
                match = _find(part, CLASS_RE);
                score[1] += match;
                // and remove them
                match && (part = part.replace(CLASS_RE, ''));
                // find all elements
                score[2] += _find(part, ELEMENT_RE);
            }
            return parseInt(score.join(''), 10);
        }

        // returns the heights possible specificity score an element can get from a give rule's selectorText
        function getSpecificityScore(element, selector_text) {
            var selectors = selector_text.split(','),
                selector, score, result = 0;
            while (selector = selectors.shift()) {
                if (matchesSelector(element, selector)) {
                    score = calculateScore(selector);
                    result = score > result ? score : result;
                }
            }
            return result;
        }

        function sortBySpecificity(element, rules) {
            // comparing function that sorts CSSStyleRules according to specificity of their `selectorText`
            function compareSpecificity (a, b) {
                return getSpecificityScore(element, b.selectorText) - getSpecificityScore(element, a.selectorText);
            }

            return rules.sort(compareSpecificity);
        }

        // Find correct matchesSelector impl
        function matchesSelector(el, selector) {
          var matcher = el.matchesSelector || el.mozMatchesSelector || 
              el.webkitMatchesSelector || el.oMatchesSelector || el.msMatchesSelector;
          return matcher.call(el, selector);
        }

        //TODO: not supporting 2nd argument for selecting pseudo elements
        //TODO: not supporting 3rd argument for checking author style sheets only
        window.getMatchedCSSRules = function (element /*, pseudo, author_only*/) {
            var style_sheets, sheet, sheet_media,
                rules, rule,
                result = [];
            // get stylesheets and convert to a regular Array
            style_sheets = toArray(window.document.styleSheets);

            // assuming the browser hands us stylesheets in order of appearance
            // we iterate them from the beginning to follow proper cascade order
            while (sheet = style_sheets.shift()) {
                // get the style rules of this sheet
                rules = getSheetRules(sheet);
                // loop the rules in order of appearance
                while (rule = rules.shift()) {
                    // if this is an @import rule
                    if (rule.styleSheet) {
                        // insert the imported stylesheet's rules at the beginning of this stylesheet's rules
                        rules = getSheetRules(rule.styleSheet).concat(rules);
                        // and skip this rule
                        continue;
                    }
                    // if there's no stylesheet attribute BUT there IS a media attribute it's a media rule
                    else if (rule.media) {
                        // insert the contained rules of this media rule to the beginning of this stylesheet's rules
                        rules = getSheetRules(rule).concat(rules);
                        // and skip it
                        continue
                    }

                    // check if this element matches this rule's selector
                    if (matchesSelector(element, rule.selectorText)) {
                        // push the rule to the results set
                        result.push(rule);
                    }
                }
            }
            // sort according to specificity
            return sortBySpecificity(element, result);
        };
}

Đã sửa lỗi

  • = match+= match
  • return re ? re.length : 0;return matches ? matches.length : 0;
  • _matchesSelector(element, selector)matchesSelector(element, selector)
  • matcher(selector)matcher.call(el, selector)

Trong getSheetRules, tôi phải thêm if (stylesheet.cssRules === null) {return []} để làm cho nó hoạt động cho tôi.
Gwater 17

Đã thử nghiệm "Phiên bản dài". Làm việc cho tôi. Quá tệ là getMatchCSSRules () chưa bao giờ được trình duyệt chuẩn hóa.
colin moock

Làm thế nào để điều này xử lý hai bộ chọn có cùng các đặc điểm cụ thể như h1 và h1, div - nơi cái được khai báo cuối cùng sẽ được sử dụng?
Stellan

Có lẽ chúng ta có thể nhận được một số ý tưởng để xử lý giả ở đây? github.com/dvtng/jss/blob/master/jss.js
mr1031011

4

Đây là phiên bản của câu trả lời của SB cũng trả về các quy tắc phù hợp trong các truy vấn phương tiện phù hợp. Tôi đã loại bỏ sự *.rules || *.cssRuleskết hợp và.matches công cụ tìm triển khai; thêm polyfill hoặc thêm lại các dòng đó nếu bạn cần.

Phiên bản này cũng trả về các CSSStyleRuleđối tượng thay vì văn bản quy tắc. Tôi nghĩ rằng điều này hữu ích hơn một chút, vì các chi tiết cụ thể của các quy tắc có thể dễ dàng được kiểm tra theo chương trình theo cách này.

Cà phê:

getMatchedCSSRules = (element) ->
  sheets = document.styleSheets
  matching = []

  loopRules = (rules) ->
    for rule in rules
      if rule instanceof CSSMediaRule
        if window.matchMedia(rule.conditionText).matches
          loopRules rule.cssRules
      else if rule instanceof CSSStyleRule
        if element.matches rule.selectorText
          matching.push rule
    return

  loopRules sheet.cssRules for sheet in sheets

  return matching

JS:

function getMatchedCSSRules(element) {
  var i, len, matching = [], sheets = document.styleSheets;

  function loopRules(rules) {
    var i, len, rule;

    for (i = 0, len = rules.length; i < len; i++) {
      rule = rules[i];
      if (rule instanceof CSSMediaRule) {
        if (window.matchMedia(rule.conditionText).matches) {
          loopRules(rule.cssRules);
        }
      } else if (rule instanceof CSSStyleRule) {
        if (element.matches(rule.selectorText)) {
          matching.push(rule);
        }
      }
    }
  };

  for (i = 0, len = sheets.length; i < len; i++) {
    loopRules(sheets[i].cssRules);
  }

  return matching;
}

Làm thế nào điều này có thể được thay đổi để được sử dụng cho cả trẻ em của những người đã qua element?
Kragalon

2
Trường hợp sử dụng của bạn là gì? Tôi không thực sự thấy điều đó sẽ hữu ích ở đâu, vì các quy tắc áp dụng cho trẻ em không nhất thiết phải áp dụng cho cha mẹ. Bạn sẽ chỉ kết thúc với một đống quy tắc không có điểm chung nào đặc biệt. Nếu bạn thực sự muốn, bạn có thể chỉ cần đệ quy lại các phần tử con và chạy phương thức này cho mỗi phần tử và tạo một mảng tất cả các kết quả.
run rẩy

Tôi chỉ đang cố gắng tạo ra cloneNode(true)chức năng nhưng cũng nhân bản sâu kiểu dáng.
Kragalon

1
điều kiện này: if (window.matchMedia (rule.conditionText) .matches) {...} đã ngăn một kết quả trùng khớp trong trường hợp của tôi vì "rule.conditionText" chưa được xác định. Không có nó, nó đã hoạt động. Bạn có thể thử và kiểm tra điều này trên news.ycombinator.com . "span.pagetop b" có quy tắc truy vấn phương tiện không khớp với chức năng của bạn.
ayal gelles

1
Chrome không hỗ trợ thuộc tính conditionText trên các bản sao CSSMediaRule.
Macil

3

Đây là phiên bản getMatchedCSSRuleshàm hỗ trợ @mediatruy vấn của tôi.

const getMatchedCSSRules = (el) => {
  let rules = [...document.styleSheets]
  rules = rules.filter(({ href }) => !href)
  rules = rules.map((sheet) => [...(sheet.cssRules || sheet.rules || [])].map((rule) => {
    if (rule instanceof CSSStyleRule) {
      return [rule]
    } else if (rule instanceof CSSMediaRule && window.matchMedia(rule.conditionText)) {
      return [...rule.cssRules]
    }
    return []
  }))
  rules = rules.reduce((acc, rules) => acc.concat(...rules), [])
  rules = rules.filter((rule) => el.matches(rule.selectorText))
  rules = rules.map(({ style }) => style)
  return rules
}

1

var GetMatchedCSSRules = (elem, css = document.styleSheets) => Array.from(css)
  .map(s => Array.from(s.cssRules).filter(r => elem.matches(r.selectorText)))
  .reduce((a,b) => a.concat(b));

function Go(paragraph, print) {
  var rules = GetMatchedCSSRules(paragraph);
PrintInfo:
  print.value += "Rule 1: " + rules[0].cssText + "\n";
  print.value += "Rule 2: " + rules[1].cssText + "\n\n";
  print.value += rules[0].parentStyleSheet.ownerNode.outerHTML;
}

Go(document.getElementById("description"), document.getElementById("print"));
p {color: red;}
#description {font-size: 20px;}
<p id="description">Lorem ipsum</p>
<textarea id="print" cols="50" rows="12"></textarea>


3
Bản sao vô nghĩa của một phiên bản cũ của câu trả lời của tôi. Chỉ làm ô nhiễm trang. Phiên bản hoàn chỉnh và cập nhật: tại đây .
7vujy0f0hy

1

Đảm bảo IE9 +, tôi đã viết một hàm tính toán CSS cho phần tử được yêu cầu và phần tử con của nó, đồng thời cung cấp khả năng lưu nó vào một className mới nếu cần trong đoạn mã bên dưới.

/**
  * @function getElementStyles
  *
  * Computes all CSS for requested HTMLElement and its child nodes and applies to dummy class
  *
  * @param {HTMLElement} element
  * @param {string} className (optional)
  * @param {string} extras (optional)
  * @return {string} CSS Styles
  */
function getElementStyles(element, className, addOnCSS) {
  if (element.nodeType !== 1) {
    return;
  }
  var styles = '';
  var children = element.getElementsByTagName('*');
  className = className || '.' + element.className.replace(/^| /g, '.');
  addOnCSS = addOnCSS || '';
  styles += className + '{' + (window.getComputedStyle(element, null).cssText + addOnCSS) + '}';
  for (var j = 0; j < children.length; j++) {
    if (children[j].className) {
      var childClassName = '.' + children[j].className.replace(/^| /g, '.');
      styles += ' ' + className + '>' + childClassName +
        '{' + window.getComputedStyle(children[j], null).cssText + '}';
    }
  }
  return styles;
}

Sử dụng

getElementStyles(document.getElementByClassName('.my-class'), '.dummy-class', 'width:100%;opaity:0.5;transform:scale(1.5);');

2
1. Bạn có thể thay thế toàn bộ computeStyleschương trình con bằng chỉ el => getComputedStyle(el).cssText. Bằng chứng: fiddle . 2. '.' + element.className là một cấu trúc bị lỗi vì nó giả định sự tồn tại của một tên lớp. Công trình hợp lệ là element.className.replace(/^| /g, '.'). 3. Hàm của bạn bỏ qua khả năng của các bộ chọn CSS khác ngoài các lớp. 4. Đệ quy của bạn bị giới hạn tùy ý ở một cấp độ (con nhưng không phải cháu). 5. Cách sử dụng: không có getElementByClassName, chỉ getElementsByClassName(trả về một mảng).
7vujy0f0hy

1

Tôi nghĩ rằng câu trả lời từ SB nên được chấp nhận vào thời điểm này nhưng nó không chính xác. Nó được đề cập một vài lần rằng sẽ có một số quy tắc có thể bị bỏ sót. Đối mặt với điều đó, tôi quyết định sử dụng document.querySelectorAll thay vì element.matches. Điều duy nhất là bạn sẽ cần một số loại nhận dạng duy nhất của các yếu tố để so sánh nó với yếu tố bạn đang tìm kiếm. Trong hầu hết các trường hợp, tôi nghĩ rằng điều đó có thể đạt được bằng cách đặt id của nó thành một giá trị duy nhất. Đó là cách bạn có thể xác định phần tử phù hợp là của bạn. Nếu bạn có thể nghĩ ra một cách chung để so khớp kết quả của document.querySelectorAll với phần tử bạn đang tìm kiếm, về cơ bản đó sẽ là một tổng hợp hoàn chỉnh của getMatchCSSRules.

Tôi đã kiểm tra hiệu suất cho document.querySelectorAll vì nó có thể chậm hơn element.matches nhưng trong hầu hết các trường hợp, nó không phải là vấn đề. Tôi thấy rằng nó mất khoảng 0,001 mili giây.

Tôi cũng tìm thấy thư viện CSSUtilities quảng cáo rằng nó có thể làm được điều này nhưng tôi cảm thấy nó cũ và đã không được cập nhật trong một thời gian. Nhìn vào mã nguồn của nó, tôi nghĩ rằng có thể có những trường hợp mà nó bỏ sót.


CSSUtilities thực sự đã cũ, nhưng nó cũng trả về các quy tắc cho trạng thái giả (ví dụ: nó có thể trả về quy tắc di chuột). Tôi chưa tìm thấy bất kỳ câu trả lời nào ở đây giải quyết trạng thái giả.
mr1031011
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.