2011-09-24 8 views

risposta

6

questo dovrebbe funzionare e non ha bisogno di jquery.

var used = []; 
var elements = null; 

//get all elements 
if (typeof document.getElementsByTagName != 'undefined') { 
    elements = document.getElementsByTagName('*'); 
} 

if (!elements || !elements.length) { 
    elements = document.all; // ie5 
} 

//loop over all element 
for (var i = 0; i < elements.length; i++){ 

    //loop over element's classes 
    var classes = elements[i].className.split(' '); 
    for (var j = 0; j < classes.length; j++) { 

     var name = classes[j]; 

     //add if not exists 
     if (name.length > 0 && used.indexOf(name) === -1) { 
      used.push(name); 
     } 
    } 
} 

alert(used.join(' ')); 

approccio più funzionale

var elements = document.getElementsByTagName('*'); 

var unique = function (list, x) { 
    if (x != "" && list.indexOf(x) === -1) { 
     list.push(x); 
    } 
    return list; 
}; 

var trim = function (x) { return x.trim(); }; 

var classes = [].reduce.call(elements, function (acc, e) { 
    return e.className.split(' ').map(trim).reduce(unique, acc); 
}, []); 
+0

Non funziona in Firefox: 'document.all' non è definito. –

+0

@RobW aggiornato. Grazie –

+0

ha dovuto aggiornarlo un po '- perché fallisce con "elements [i] .className.split (' ')" - non è una funzione. ecco il codice aggiornato - https://jsfiddle.net/dqad4n90/ – shershen

0

Dai un'occhiata a Dust Me Selectors.

Non è esattamente quello che stai cercando, mostra un elenco di selettori non utilizzati. Tuttavia, immagino che potresti usare l'inverso della lista che fornisce.

Ecco il link: http://www.sitepoint.com/dustmeselectors/

+0

Lo so, ma questo non risolverebbe il mio problema. – KuldipMCA

+0

Sembra una buona estensione, tuttavia si tratta solo del supporto FF3.5! Siamo ora su Firefox "6.0" (4.0 con 2 versioni di bugfix). – Bojangles

+0

@ KuldipMCA Beh, vi porterà un po 'di là. Per favore dedica un po 'del tuo impegno al problema che stai facendo. – Bojangles

6

Se hai jQuery nella pagina, eseguire questo codice:

var classArray = []; 
$('*').each(function(){if(this.className!=""){classArray.push(this.className)}}) 

La variabile classArray conterrà tutte le classi indicate in quella pagina HTML.

+0

+1 per una soluzione piacevole @MisterGreen. E benvenuti a SO! –

+1

avrai duplicati nel risultato. –

+0

tagnames e ID sono nella lista – shershen

0

So che questa è una vecchia questione, ma arrivato tramite Google così ho il sospetto che più persone possono ottenere anche qui.

La via più breve, usando querySelectorAll e classList (che significa, il supporto del browser potrebbe essere un problema: IE10 for classList e IE8 for querySelectorAll), e con i duplicati, sarebbe:

var classes = 0, 
elements = document.querySelectorAll('*'); 

for (var i = 0; i < elements.length; i++) { 
    classes = classes + elements[i].classList.length;   
} 

I made a jsFiddle con un ripiego per classList (che ha il "browser" più basso) che conta anche tutti gli elementi, tutte le classi e tutti gli elementi con le classi se non stai usando classList.

Non ho aggiunto un rilevamento univoco, potrei arrivarci un giorno.

+0

Grazie! Bello per una soluzione recente. Plain vanilla JavaScript -> Non richiede jQuery. –

0

rapidamente le classi di elenco da console (ignorando '* ñg-' classi angolari)

(global => { 
 
    // get all elements 
 
    const elements = document.getElementsByTagName('*'); 
 
    // add only unique classes 
 
    const unique = (list, x) => { 
 
     x != '' && list.indexOf(x) === -1 && x.indexOf('ng-') !== 0 && list.push(x);      
 
     return list; 
 
    }; 
 
    // trim 
 
    const trim = (x) => x.trim(); 
 
    // add to variable 
 
    global.allClasses = [].reduce.call(elements, (acc, e) => e.className.split(' ').map(trim).reduce(unique, acc), []).sort(); 
 
    console.log(window.allClasses); 
 
})(window);

Problemi correlati