【问题标题】:Finding all classes that match a pattern in an HTML document?查找与 HTML 文档中的模式匹配的所有类?
【发布时间】:2009-02-05 10:37:39
【问题描述】:

我今天开始思考:获取文档中使用的(最好)匹配模式(正则表达式)模式或(或者)以某个特定开头的类的不同(即不重复)列表的最佳方法是什么字符序列? JQuery 可用于此或直接使用 Javascript。

现在它显然应该满足所有合法类的用法,例如:

<div class="class1 class2 class3">
</div>

而且我不想用正则表达式解析文档。这太容易出错了。我感兴趣的是一个遍历 DOM 或使用 jQuery 之类的东西来执行此操作的 Jaavascript 解决方案。

哦,这还应该包括通过以前的 Javascript 代码动态添加/删除的任何类。

建议?

【问题讨论】:

    标签: javascript jquery html css jquery-1.3


    【解决方案1】:
    function gatherClasses() {
        var tags = document.getElementsByTagName('*');
        var cls, clct = {}, i, j, l = tags.length;
        for( i = 0; i < l; i++ ) {
            cls = tags[i].className.split(' ');
            for( j = 0; j < cls.length; j++ ) {
                if( !cls[j] ) continue;
                clct[cls[j]] = 'dummy'; //so we only get a class once
            }
        }
        cls = [];
        for( i in clct ) {
            cls.push( i );
        }
        return cls;
    } 
    alert(gatherClasses())
    

    这是一个带有正则表达式匹配的版本

    function gatherClasses( matchString ) {
        if( matchString ) {
            var rxp = new RegExp( matchString );
        } else {
            var rxp = /.*/;
        }
        var tags = document.getElementsByTagName('*');
        var cls, clct = {}, i, j, l = tags.length;
        for( i = 0; i < l; i++ ) {
            cls = tags[i].className.split(' ');
            for( j = 0; j < cls.length; j++ ) {
                if( !cls[j] || !rxp.test( cls[j] ) ) {
                    continue;
                }
                clct[cls[j]] = 'dummy'; //so we only get a class once
            }
        }
        cls = [];
        for( i in clct ) {
            cls.push( i );
        }
        return cls;
    }
    //find classes that match 'stack'
    alert(gatherClasses('stack'))
    

    【讨论】:

    • 这也可行,但其他解决方案只是更简洁(好东西)和更健壮一点(例如在 \s+ 而不是''上拆分)。
    【解决方案2】:

    这对你有帮助吗?

    http://httpcode.com/blogs/PermaLink,guid,77f17d9c-cdc0-4fcb-a392-3cc70ef6ac23.aspx

    <input type="radio" class="star star_id_45 star_group_5" />
    
    $("input[class*='star_id_45']")
    

    【讨论】:

    • 有点。我没有意识到您可以使用类属性进行通配符匹配(参见 href ),但我想没有理由不这样做。只是我没有想到。但我真的很喜欢不同的类名,而不是一组包含它们的元素。
    【解决方案3】:

    使用 jQuery:

    var listClasses = function( pattern ){
        var allClassesTmp = {}, allClasses = []; 
        var rx = pattern ? (new RegExp(pattern)) : (new RegExp(".*"));
    
        $('*[class]').each( function(){ 
            var cn = this.className.split(/\s+/); 
            for(var i=cn.length;--i>-1;){ 
                if(rx.test(cn[i]))allClassesTmp[ cn[i] ] = 1 
            } 
        }); 
        for(var i in allClassesTmp)allClasses.push(i); 
        return allClasses;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2015-10-01
      • 2015-02-09
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多