How can you determine if a css class exists with Javascript?

前端 未结 10 953
闹比i
闹比i 2020-11-27 04:14

Is there a way to determine whether or not a css class exists using JavaScript?

相关标签:
10条回答
  • 2020-11-27 04:28

    Based on the answer, I created a javascript function for searching for a CSS class in the browser's memory -

    var searchForCss = function (searchClassName) {
      for (let i = 0; i < document.styleSheets.length; i++) {
        let styleSheet = document.styleSheets[i];
        try {
          for (let j = 0; j < styleSheet.cssRules.length; j++) {
            let rule = styleSheet.cssRules[j];
            // console.log(rule.selectorText)
            if (rule.selectorText && rule.selectorText.includes(searchClassName)) {
              console.log('found - ', rule.selectorText, ' ', i, '-', j);
            }
          }
          if (styleSheet.imports) {
            for (let k = 0; k < styleSheet.imports.length; k++) {
              let imp = styleSheet.imports[k];
              for (let l = 0; l < imp.cssRules.length; l++) {
                let rule = imp.cssRules[l];
                if (
                  rule.selectorText &&
                  rule.selectorText.includes(searchClassName)
                ) {
                  console.log('found - ',rule.selectorText,' ',i,'-',k,'-',l);
                }
              }
            }
          }
        } catch (err) {}
      }
    };
    
    searchForCss('my-class-name');
    

    This will print a line for each occurrence of the class name in any of the rules in any of the stylesheets.

    Ref - Search for a CSS class in the browser memory

    0 讨论(0)
  • 2020-11-27 04:33

    Here is my solution to this. I'm essentially just looping through document.styleSheets[].rules[].selectorText as @helen suggested.

    /**
     * This function searches for the existence of a specified CSS selector in a given stylesheet.
     *
     * @param (string) styleSheetName - This is the name of the stylesheet you'd like to search
     * @param (string) selector - This is the name of the selector you'd like to find
     * @return (bool) - Returns true if the selector is found, false if it's not found
     * @example - console.log(selectorInStyleSheet ('myStyleSheet.css', '.myClass'));
     */    
    
    function selectorInStyleSheet(styleSheetName, selector) {
        /*
         * Get the index of 'styleSheetName' from the document.styleSheets object
         */
        for (var i = 0; i < document.styleSheets.length; i++) {
            var thisStyleSheet = document.styleSheets[i].href ? document.styleSheets[i].href.replace(/^.*[\\\/]/, '') : '';
            if (thisStyleSheet == styleSheetName) { var idx = i; break; }
        }
        if (!idx) return false; // We can't find the specified stylesheet
    
        /*
         * Check the stylesheet for the specified selector
         */
        var styleSheet = document.styleSheets[idx];
        var cssRules = styleSheet.rules ? styleSheet.rules : styleSheet.cssRules;
        for (var i = 0; i < cssRules.length; ++i) {
            if(cssRules[i].selectorText == selector) return true;
        }
        return false;
    }
    

    This function offers a speed improvement over other solutions in that we are only searching the stylesheet passed to the function. The other solutions loop through all the stylesheets which is in many cases unnecessary.

    0 讨论(0)
  • 2020-11-27 04:35

    This should be possible to do using the document.styleSheets[].rules[].selectorText and document.styleSheets[].imports[].rules[].selectorText properties. Refer to MDN documentation.

    0 讨论(0)
  • 2020-11-27 04:38

    Oneliner:

    [].slice.call(document.styleSheets)
    .reduce( (prev, styleSheet) => [].slice.call(styleSheet.cssRules))
    .reduce( (prev, cssRule) => prev + cssRule.cssText)
    .includes(".someClass")
    
    0 讨论(0)
  • 2020-11-27 04:39

    Add this Condition Above

    if (!document.getElementsByClassName('className').length){
        //class not there
    }
    else{
    //class there
    }
    

    If want to check on a element Just use

    element.hasClassName( className );
    

    also you can use on a ID

    document.getElementById("myDIV").classList.contains('className');
    

    Good Luck !!!

    0 讨论(0)
  • 2020-11-27 04:40

    Building on Helen's answer, I came up with this:

    //**************************************************************************
    //** hasStyleRule
    //**************************************************************************
    /** Returns true if there is a style rule defined for a given selector.
     *  @param selector CSS selector (e.g. ".deleteIcon", "h2", "#mid")
     */
      var hasStyleRule = function(selector) {
    
          var hasRule = function(selector, rules){
              if (!rules) return false;
              for (var i=0; i<rules.length; i++) {
                  var rule = rules[i];
                  if (rule.selectorText){ 
                      var arr = rule.selectorText.split(',');
                      for (var j=0; j<arr.length; j++){
                          if (arr[j].indexOf(selector) !== -1){
                              var txt = trim(arr[j]);
                              if (txt===selector){
                                  return true;
                              }
                              else{
                                  var colIdx = txt.indexOf(":");
                                  if (colIdx !== -1){
                                      txt = trim(txt.substring(0, colIdx));
                                      if (txt===selector){
                                          return true;
                                      }
                                  }
                              }
                          }
                      }
                  }
              }
              return false;
          };
    
          var trim = function(str){
              return str.replace(/^\s*/, "").replace(/\s*$/, "");
          };
    
          for (var i=0; i<document.styleSheets.length; i++){
              var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules;
              if (hasRule(selector, rules)){
                  return true;
              }
    
              var imports = document.styleSheets[i].imports;
              if (imports){
                  for (var j=0; j<imports.length; j++){
                      rules = imports[j].rules || imports[j].cssRules;
                      if (hasRule(selector, rules)) return true;
                  }
              }
          } 
    
          return false;
      };
    
    0 讨论(0)
提交回复
热议问题