2009-02-05 110 views
4

我今天想到了:在文檔中(最好)匹配模式(正則表達式)模式或(或者)以特定字符開頭的文檔中獲得獨特(即不重複)列表的最佳方式是什麼序列? JQuery可以用於這個或只是直接的Javascript。查找與HTML文檔中的模式匹配的所有類?

現在顯然應該滿足所有法律類用途,例如:

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

而且我不想來解析使用正則表達式的文件。這太容易出錯了。我感興趣的是一個Jaquer解決方案,它可以遍歷DOM或使用類似jQuery的方法來實現。

哦,這應該也包括任何通過以前的Javascript代碼動態添加/刪除的類。

對此提出建議?

回答

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; 
} 
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']") 
+0

排序的。我沒有意識到你可以做與類屬性匹配的通配符(看到它的href),但我想沒有理由爲什麼不。剛剛沒有發生在我身上。但我真的是在不同的類名之後,而不是與他們一起包裝的元素。 – cletus 2009-02-05 11:05:02

2
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')) 
+0

這也適用,但另一個解決方案只是一個小東西(好東西)和一個更強大一點(例如分裂在\ s +而不是'')。 – cletus 2009-02-06 01:43:51

相關問題