Найти все классы, которые соответствуют шаблону в документе HTML? - PullRequest
4 голосов
/ 05 февраля 2009

Сегодня я задумался: как лучше всего получить отдельный (т.е. не повторяющийся) список классов, используемых в документе, которые (предпочтительно) соответствуют шаблону (регулярному выражению) или (альтернативно) начинаются с определенного последовательность символов? JQuery может быть использован для этого или просто прямой Javascript.

Теперь он, очевидно, должен обслуживать все типы легальных классов, например:

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

И я не хочу анализировать документ с помощью регулярных выражений. Это просто слишком подвержено ошибкам. Меня интересует решение Jaavascript, которое обходит DOM или использует что-то вроде jQuery для этого.

О, это также должно включать любые классы, которые были динамически добавлены / удалены с помощью предыдущего кода Javascript.

Предложения

Ответы [ 3 ]

3 голосов
/ 05 февраля 2009

Может ли это вам помочь?

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']")
2 голосов
/ 05 февраля 2009

Использование 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;
}
2 голосов
/ 05 февраля 2009
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'))
...