如何确定 Javascript 是否存在 css 类?

IT技术 javascript
2021-01-20 00:47:36

有没有办法使用 JavaScript 确定 css 类是否存在?

6个回答

这应该可以使用document.styleSheets[].rules[].selectorTextdocument.styleSheets[].imports[].rules[].selectorText属性来完成请参阅MDN 文档

@AshBlue:看起来 EE 改变了他们的网站设计。尝试archive.org版本:web.archive.org/web/20071210160927/http://...或者,您可以通过欺骗您的用户代理字符串使其看起来像 Googlebot(例如使用 Firefox 的用户代理切换器扩展)来查看“实时”站点上的答案。
2021-03-17 00:47:36
使用谷歌缓存链接查看专家交流答案或在谷歌中搜索“JavaScript:检查 CSS 类是否存在”以前往那里。专家交流是关于显示您需要 Google 推荐人或使用 Google 缓存的答案(其他方法可能有效,但我知道这些!) 209.85.229.132/...
2021-03-25 00:47:36
专家交流的秘诀就是继续滚动。答案就在他们所有的“立即注册!”之下。文本。
2021-03-27 00:47:36
谢谢,我之前找到了那个链接并尝试查看谷歌缓存,但显然没有向下滚动到足够远的页面。前几个回复都带有“注册以查看”文本。
2021-04-02 00:47:36
代码列在上面 Shadi 评论的链接中。基本上,您可以浏览内存中的选择器以查找选择器文本。谢谢海伦谢谢沙迪
2021-04-08 00:47:36
function getAllSelectors() { 
    var ret = [];
    for(var i = 0; i < document.styleSheets.length; i++) {
        var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules;
        for(var x in rules) {
            if(typeof rules[x].selectorText == 'string') ret.push(rules[x].selectorText);
        }
    }
    return ret;
}


function selectorExists(selector) { 
    var selectors = getAllSelectors();
    for(var i = 0; i < selectors.length; i++) {
        if(selectors[i] == selector) return true;
    }
    return false;
}
不从包含的样式表返回 css 规则
2021-03-22 00:47:36
不能很好地工作,至少在 chrome 上是这样.. 1. 打开开发者控制台 (f12)。2. 粘贴函数getAllSelectors()。3.在这个页面上调用它,我得到的是:[".wmd-snippet-button span", ".wmd-snippet-button:hover span", "#newsletter-ad", "#newsletter-ad -header”、“#newsletter-ad ul”、“#newsletter-ad ul li”、“#newsletter-signup-container”、“#newsletter-preview-container”、“#newsletter-email-input”]。<--(这显然不是这个页面上的所有选择器)
2021-04-04 00:47:36
得到:未捕获的 DOMException:无法从“CSSStyleSheet”读取“规则”属性:无法访问规则
2021-04-06 00:47:36

这是我对此的解决方案。我基本上只是像@helen 建议的那样循环遍历 document.styleSheets[].rules[].selectorText。

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

与其他解决方案相比,此函数提供了速度改进,因为我们只搜索传递给该函数的样式表。其他解决方案遍历所有样式表,这在许多情况下是不必要的。

将 document.styleSheets.length 的值放在一个变量中。
2021-03-16 00:47:36
@Soaku 这个答案不使用 jquery ......不确定你的错误来自哪里。
2021-03-21 00:47:36
jQuery.Deferred 异常:无法读取 null 的属性“长度”类型错误:无法读取 null 的属性“长度”
2021-04-02 00:47:36
检查 idx 的未定义值最好使用 if(typeof idx != 'undefined'),否则 idx 的 0 值将被忽略。
2021-04-10 00:47:36

根据答案,我创建了一个 javascript 函数,用于在浏览器的内存中搜索 CSS 类 -

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');

这将在任何样式表的任何规则中为每次出现的类名打印一行。

Ref -在浏览器内存中搜索 CSS 类

/* 您可以遍历当前加载的每个样式表,并为您指定的任何选择器文本返回所有已定义规则的数组,从标签名称到类名称或标识符。

不要包含“#”或“.” id 或类名的前缀。

Safari 过去会跳过禁用的样式表,可能还有其他问题,但在浏览器中阅读规则通常比编写新规则更有效。*/

function getDefinedCss(s){
    if(!document.styleSheets) return '';
    if(typeof s== 'string') s= RegExp('\\b'+s+'\\b','i'); // IE capitalizes html selectors 

    var A, S, DS= document.styleSheets, n= DS.length, SA= [];
    while(n){
        S= DS[--n];
        A= (S.rules)? S.rules: S.cssRules;
        for(var i= 0, L= A.length; i<L; i++){
            tem= A[i].selectorText? [A[i].selectorText, A[i].style.cssText]: [A[i]+''];
            if(s.test(tem[0])) SA[SA.length]= tem;
        }
    }
    return SA.join('\n\n');
}

getDefinedCss('p') //如果你愿意,可以替换一个类名或ID

级联中的最新项目首先列出