4

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

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

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

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

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

建议?

4

3 回答 3

4
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'))
于 2009-02-05T10:53:04.487 回答
3

这可以帮助你吗?

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']")
于 2009-02-05T10:47:49.490 回答
2

使用 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;
}
于 2009-02-05T11:42:25.917 回答