सभी सीएसएस नियम खोजें जो एक तत्व पर लागू होते हैं


87

कई उपकरण / एपीआई विशिष्ट वर्गों या आईडी के तत्वों के चयन के तरीके प्रदान करते हैं। ब्राउज़र द्वारा लोड की गई कच्ची स्टाइलशीट का निरीक्षण करना भी संभव है।

हालांकि, किसी तत्व को रेंडर करने के लिए ब्राउज़र के लिए, वे सभी CSS नियमों (संभवत: विभिन्न स्टाइलशीट फ़ाइलों से) को संकलित करेंगे और इसे तत्व पर लागू करेंगे। यह वही है जो आप फायरबग या वेबकीट इंस्पेक्टर के साथ देखते हैं - एक तत्व के लिए पूर्ण सीएसएस वंशानुक्रम वृक्ष।

अतिरिक्त ब्राउज़र प्लगइन्स की आवश्यकता के बिना मैं शुद्ध जावास्क्रिप्ट में इस सुविधा को कैसे पुन: पेश कर सकता हूं?

शायद एक उदाहरण मैं क्या देख रहा हूँ के लिए कुछ स्पष्टीकरण प्रदान कर सकता है:

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

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

यहाँ p # विवरण तत्व में दो सीएसएस नियम लागू हैं: एक लाल रंग और 20 पीएक्स का फ़ॉन्ट आकार।

मैं उस स्रोत को खोजना चाहता हूं जहां से ये गणना किए गए सीएसएस नियम उत्पन्न होते हैं (रंग पी नियम और इसी तरह आता है)।



ब्राउज़र में देखें और ब्राउज़र डेवलपर टूल (उदाहरण के लिए क्रोम में तत्व टैब)?
रॉनी रोइस्टन

जवाबों:


77

चूंकि यह प्रश्न वर्तमान में एक हल्का (गैर-पुस्तकालय), क्रॉस-ब्राउज़र संगत उत्तर नहीं है, मैं एक प्रदान करने का प्रयास करूंगा:

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/

कॉलिंग css(document.getElementById('elementId'))प्रत्येक सीएसएस नियम के लिए एक तत्व के साथ एक सरणी लौटाएगा जो पारित तत्व से मेल खाता है। यदि आप प्रत्येक नियम के बारे में अधिक विशिष्ट जानकारी प्राप्त करना चाहते हैं, तो CSSRule ऑब्जेक्ट प्रलेखन देखें।


1
a.matchesइस पंक्ति में परिभाषित किया गया है a.matches = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.msMatchesSelector || a.oMatchesSelector:। इसका मतलब है, अगर पहले से ही डोम नोड्स के लिए एक (मानक) "मैच" विधि है, तो यह उस एक का उपयोग करेगा, अन्यथा यह वेबकिट विशिष्ट एक (वेबकिटमैचेस सेलेक्टर) का उपयोग करने की कोशिश करता है, फिर मोज़िला, माइक्रोसॉफ्ट और ओपेरा वाले। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: developer.mozilla.org/en/docs/Web/API/Element/matches
SB

3
दुर्भाग्य से, मुझे लगता है कि यह विकल्प उन सभी सीएसएस नियमों का पता नहीं लगाता है जो बच्चों में मूल तत्वों से कैस्केड करते हैं। फिडेल: jsfiddle.net/t554xo2L इस मामले में, उल नियम (जो तत्व पर लागू होता है) की if (a.matches(rules[r].selectorText))रखवाली की स्थिति में मेल नहीं खाता है ।
funforums

2
मैंने कभी यह दावा नहीं किया कि यह सूचीबद्ध / विरासत में मिला / सीएसएस नियम - यह सब करता है सीएसएस नियमों की सूची है जो पारित तत्व से मेल खाते हैं। यदि आप उस तत्व के लिए विरासत में दिए गए नियमों को प्राप्त करना चाहते हैं, तो आपको संभवतः DOM को आगे की ओर बढ़ाना होगा और css()प्रत्येक मूल तत्व पर कॉल करना होगा।
एसबी

2
मुझे पता है :-) मैं सिर्फ इस तरफ इशारा करना चाहता था क्योंकि लोग इस सवाल पर गौर कर सकते हैं कि यह 'सभी एलएसएस नियम जो किसी तत्व पर लागू होते हैं', जैसा कि सवाल का शीर्षक कहता है, जो कि ऐसा नहीं है ।
funforums

3
यदि आप चाहते हैं कि सभी नियम वर्तमान में विरासत में मिले तत्वों सहित लागू हों, तो आपको getComputedStyle का उपयोग करना चाहिए। उस के प्रकाश में, मुझे लगता है कि यह उत्तर सही है और माता-पिता से विरासत में मिली शैलियों को शामिल नहीं करना सही है (उदाहरण के लिए, माता-पिता को सौंपा गया पाठ रंग)। हालाँकि, इसमें शामिल नहीं है, लेकिन मीडिया के प्रश्नों के साथ सशर्त रूप से लागू नियम हैं।
कांप

24

EDIT: यह उत्तर अब हटा दिया गया है और अब क्रोम 64+ में काम नहीं करता है । ऐतिहासिक संदर्भ को छोड़कर। वास्तव में, बग रिपोर्ट इस प्रश्न का उपयोग करने के लिए वैकल्पिक समाधानों के लिए वापस लिंक करती है।


लगता है कि मैं एक और घंटे के शोध के बाद अपने सवाल का जवाब देने में कामयाब रहा।

यह इतना सरल है:

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

(वेबकीट / क्रोम में काम करता है, संभवतः अन्य भी)


4
यदि यह केवल क्रोम द्वारा समर्थित है, तो यह बहुत उपयोग का नहीं है। यह सभी आगंतुकों के 5% से कम (जनसांख्यिकी के आधार पर) के लिए काम करेगा।
तोमासी

5
@ डियामैंडिव: जून 2012 तक, क्रोम उपयोग की हिस्सेदारी 32% से अधिक हो गई है (और आईई उपयोग से थोड़ा अधिक है!)। gs.statcounter.com
रॉय टिंकर

6
getMatchedCSSRules आपको अंतिम शैलियों को नहीं दिखाता है जो तत्व पर लागू होती हैं। यह सभी CSSStyleRule ऑब्जेक्ट्स की एक सरणी देता है जो उस क्रम में लागू होते हैं जिसमें वे दिखाई देते हैं। यदि आप CSS मीडिया क्वेरी के माध्यम से उत्तरदायी वेब डिज़ाइन करते हैं या एक से अधिक स्टाइल शीट लोड करते हैं (जैसे IE के लिए एक), तो आपको अभी भी लौटे प्रत्येक शैली के माध्यम से लूप करने की आवश्यकता है और प्रत्येक नियम के लिए सीएसएस विशिष्टता की गणना करें। फिर लागू होने वाले अंतिम नियमों की गणना करें। आपको ब्राउज़र के स्वाभाविक रूप से क्या करने की आवश्यकता है। इसे अपने उदाहरण में साबित करने के लिए, अपनी शैली की घोषणा की शुरुआत के लिए "p {color: blue! Important}" को प्रीपेन्ड करें।
mrbinky3000

24
यह अब क्रोम 41 में पदावनत हो गया है । कोड देखें । http://www.p/chromium/issues/detail ? id=437569#c2
डैनियल डारबोस

5
इसे अंततः Chrome 63 (आधिकारिक ब्लॉग पोस्ट - जो इस प्रश्न पर वापस इंगित करता है) में हटा दिया गया है
ब्रिचिन्स

20

लघु संस्करण 12 अप्रैल 2017

चैलेंजर प्रकट होता है।

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

रेखा /* 1 */सभी नियमों का एक फ्लैट सरणी बनाती है।
रेखा /* 2 */गैर-मिलान नियमों का पालन करती है।

उसी पृष्ठ पर @SB द्वारा फ़ंक्शन केcss(el) आधार पर ।

उदाहरण 1

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

उदाहरण 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>

कमियों

  • कोई मीडिया हैंडलिंग नहीं @import, नहीं @media
  • क्रॉस-डोमेन स्टाइलशीट से लोड की गई शैलियों तक पहुंच नहीं।
  • चयनकर्ता "विशिष्टता" (महत्व का क्रम) द्वारा कोई छँटाई नहीं करता।
  • माता-पिता से विरासत में मिली कोई शैली नहीं।
  • पुराने या अल्पविकसित ब्राउज़रों के साथ काम नहीं कर सकते।
  • सुनिश्चित नहीं है कि यह छद्म वर्गों और छद्म चयनकर्ताओं के साथ कैसे मेल खाता है, लेकिन ठीक किराया लगता है।

शायद मैं एक दिन इन कमियों को संबोधित करूंगा।

लंबा संस्करण 12 अगस्त 2018

यहाँ किसी के GitHub पृष्ठ से लिया गया एक अधिक व्यापक कार्यान्वयन है (इस मूल कोड से , Bugzilla के माध्यम से कांटा गया )। गेको और IE के लिए लिखा गया है, लेकिन पलक के साथ भी काम करने की अफवाह है।

4 मई 2017: विशिष्टता कैलकुलेटर में महत्वपूर्ण कीड़े थे जो मैंने अब ठीक कर दिए हैं। (मैं लेखकों को सूचित नहीं कर सकता क्योंकि मेरे पास GitHub खाता नहीं है।)

12 अगस्त 2018: हाल के क्रोम अपडेट में ऑब्जेक्ट thisचर ( ) को स्वतंत्र चर को सौंपे गए तरीकों से हटा दिया गया है। इसलिए मंगलाचरण matcher(selector)ने काम करना बंद कर दिया है। इसे बदलकर इसे matcher.call(el, selector)हल किया है।

// 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);
        };
}

ठीक हो गया

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

GetSheetRules में मुझे जोड़ना था अगर (stylheet.cssRules === null) {वापसी []} इसे पाने के लिए मुझे काम करने के लिए।
Gwater17

"लंबे संस्करण" का परीक्षण किया। मेरे लिये कार्य करता है। बहुत बुरा getMatchedCSSRules () ब्राउज़र द्वारा कभी भी मानकीकृत नहीं किया गया था।
कॉलिन मॉक

यह दो चयनकर्ताओं को एक ही विशिष्टता के साथ कैसे संभालता है जैसे, h1 और h1, div - जहां अंतिम घोषित किए गए का उपयोग किया जाना चाहिए?
स्टेलन

यहाँ हम छद्म से निपटने के लिए कुछ विचार प्राप्त कर सकते हैं? github.com/dvtng/jss/blob/master/jss.js
mr1031011

19

इस लाइब्रेरी पर एक नज़र डालें, जो यह पूछती है: http://www.brothercake.com/site/resources/scripts/cssutilities/

यह IE6 के ठीक पीछे के सभी आधुनिक ब्राउज़रों में काम करता है, आपको फायरबग की तरह नियम और संपत्ति संग्रह दे सकता है (वास्तव में यह फायरबग की तुलना में अधिक सटीक है), और किसी भी नियम के सापेक्ष या पूर्ण विशिष्टता की गणना भी कर सकता है। एकमात्र चेतावनी यह है कि, हालांकि यह स्थिर मीडिया प्रकारों को समझता है, यह मीडिया-प्रश्नों को नहीं समझता है।


यह मॉड्यूल वास्तव में बहुत अच्छा है, बस आशा है कि इसे लेखक से अधिक प्यार मिलेगा।
mr1031011

4

यहां SB के उत्तर का एक संस्करण दिया गया है जो मिलान वाले मीडिया क्वेरी के भीतर मिलान नियम भी देता है। मैंने *.rules || *.cssRulescoalescence और .matchesकार्यान्वयन खोजक को हटा दिया है ; पॉलीफ़िल जोड़ें या उन पंक्तियों को वापस जोड़ें यदि आपको उनकी आवश्यकता है।

यह संस्करण CSSStyleRuleनियम पाठ के बजाय ऑब्जेक्ट भी लौटाता है । मुझे लगता है कि यह थोड़ा अधिक उपयोगी है, क्योंकि नियमों की बारीकियों को इस तरह प्रोग्रामेटिक रूप से अधिक आसानी से जांचा जा सकता है।

कॉफ़ी:

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

जे एस:

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;
}

यह कैसे बदला जा सकता है पास के बच्चों पर भी इस्तेमाल किया जा सकता है element?
क्रैग्लोन

2
आपका उपयोग मामला क्या है? मैं वास्तव में यह नहीं देखता कि यह कहाँ उपयोगी होगा, क्योंकि बच्चों पर लागू होने वाले नियम माता-पिता के लिए आवश्यक रूप से लागू नहीं होते हैं। आप बस नियमों के ढेर के साथ समाप्त होंगे, विशेष रूप से आम में कुछ भी नहीं। यदि आप वास्तव में चाहते हैं कि आप बस बच्चों पर पुनर्विचार कर सकें और प्रत्येक के लिए इस विधि को चला सकें, और सभी परिणामों की एक सरणी बना सकें।
कांप

मैं केवल cloneNode(true)कार्यक्षमता बनाने की कोशिश कर रहा हूं, लेकिन साथ ही साथ गहरी क्लोनिंग भी कर रहा हूं ।
Kragalon

1
यह स्थिति: अगर (window.matchMedia (rule.conditionText) .matches) {...} ने मेरे मामले में एक मैच को रोका, क्योंकि "rule.conditionText" अपरिभाषित था। इसके बिना, यह काम किया। आप news.ycombinator.com पर इसे आज़मा सकते हैं और परख सकते हैं । "span.pagetop b" में एक मीडिया क्वेरी नियम है जो आपके फ़ंक्शन के साथ मेल नहीं खाता है जैसा कि यह है।
आलय गिले

1
Chrome CSSMediaRule इंस्टेंस पर कंडीशनटेक्स्ट प्रॉपर्टी का समर्थन नहीं करता है।
मैकिल सेप

3

यहां getMatchedCSSRulesफ़ंक्शन का मेरा संस्करण है जो @mediaक्वेरी का समर्थन करता है ।

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
मेरे उत्तर के एक पुराने संस्करण की व्यर्थ नकल । पृष्ठ को प्रदूषित कर रहा है। पूर्ण और अद्यतित संस्करण: यहां
7vujy0f0hy

1

IE9 + को सुनिश्चित करते हुए, मैंने एक फ़ंक्शन लिखा, जो अनुरोध किए गए तत्व और उसके बच्चों के लिए सीएसएस की गणना करता है, और नीचे स्निपेट में यदि आवश्यक हो तो इसे एक नए क्लासनेम में सहेजने की संभावना देता है।

/**
  * @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;
}

प्रयोग

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

2
1. आप पूरे computeStylesसबरूटीन को बस से बदल सकते हैं el => getComputedStyle(el).cssText। प्रमाण: फिडल2. '.' + element.className एक दोषपूर्ण निर्माण है क्योंकि यह एक वर्ग नाम के अस्तित्व को मानता है। वैध निर्माण है element.className.replace(/^| /g, '.')3. आपका कार्य केवल कक्षाओं की तुलना में अन्य CSS चयनकर्ताओं की संभावना को नजरअंदाज करता है। 4. आपकी पुनरावृत्ति मनमाने ढंग से एक स्तर तक सीमित है (बच्चे नहीं बल्कि पोते)। 5. उपयोग: कोई नहीं है getElementByClassName, केवल getElementsByClassName(एक सरणी देता है)।
7vujy0f0hy

1

मुझे लगता है कि एसबी का जवाब इस बिंदु पर स्वीकार किया जाना चाहिए, लेकिन यह सटीक नहीं है। यह कुछ समय का उल्लेख है कि कुछ नियम होंगे जो याद किए जा सकते हैं। उस के साथ, मैंने element.matches के बजाय document.querySelectorAll का उपयोग करने का निर्णय लिया। केवल एक चीज यह है कि आप जिस किसी की तलाश कर रहे हैं, उसकी तुलना करने के लिए आपको किसी प्रकार की विशिष्ट पहचान की आवश्यकता होगी। ज्यादातर मामलों में मुझे लगता है कि एक अद्वितीय मूल्य के लिए इसकी आईडी सेट करके प्राप्त करने योग्य है। यही कारण है कि आप मिलान किए जा रहे तत्व की पहचान कर सकते हैं। यदि आप दस्तावेज़ के परिणाम से मेल खाने के लिए एक सामान्य तरीके के बारे में सोच सकते हैं। आप जिस तत्व की तलाश कर रहे हैं, वह अनिवार्य रूप से getMatchedCSSRules का एक पूरा पॉलीफ़िल होगा।

मैंने document.querySelectorAll के लिए प्रदर्शन की जाँच की, क्योंकि यह शायद element.matches की तुलना में धीमी है, लेकिन ज्यादातर मामलों में यह एक समस्या नहीं होनी चाहिए। मैं देखता हूं कि यह लगभग 0.001 मिलीसेकंड लेता है।

मुझे CSSUtilities पुस्तकालय भी मिला है जो यह कहता है कि यह ऐसा कर सकता है लेकिन मुझे इसका पुराना लग रहा है और थोड़ी देर में अपडेट नहीं किया गया है। इसके स्रोत कोड को देखते हुए, यह मुझे लगता है कि ऐसे मामले हो सकते हैं जो इसे याद करते हैं।


CSSUtilities वास्तव में पुराना है, लेकिन यह छद्म राज्यों के लिए भी नियम लौटाता है (उदाहरण के लिए यह होवर नियमों को लौटा सकता है)। मुझे यहाँ कोई जवाब नहीं मिला है जो अभी तक छद्म राज्य को संबोधित करता है।
15:10 बजे mr1031011
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.