2011-09-24 5 views

Respuesta

6

esto debería funcionar y no necesita 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(' ')); 

enfoque más funcional

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

No funciona en Firefox: 'document.all' no está definido. –

+0

@RobW actualizado. Gracias –

+0

tuve que actualizarlo un poco - porque falla con "elements [i] .className.split ('')" - no es una función. aquí está el código actualizado - https://jsfiddle.net/dqad4n90/ – shershen

0

Eche un vistazo a los selectores de polvo.

No es exactamente lo que está buscando, muestra una lista de selectores no utilizados. Sin embargo, imagino que podrías usar el inverso de la lista que proporciona.

Aquí está el enlace: http://www.sitepoint.com/dustmeselectors/

+0

Lo sé, pero eso no resolvería mi problema. – KuldipMCA

+0

Parece una buena extensión, ¡sin embargo, solo habla de la compatibilidad con FF3.5! Ahora estamos en Firefox "6.0" (4.0 con 2 versiones de corrección de errores). – Bojangles

+0

@KuldipMCA Bueno, te llevará un poco del camino hasta allí. Por favor, ponga algo de su propio esfuerzo en el problema que está teniendo. – Bojangles

6

Si tienes jQuery en la página, ejecute este código:

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

La variable classArray contendrá todas las clases especificadas en esa página HTML.

+0

+1 para una buena solución @MisterGreen. Y bienvenido a SO! –

+1

va a tener duplicados en su resultado. –

+0

los nombres de las etiquetas y los ID están en la lista – shershen

0

Sé que esto es una vieja pregunta, pero tengo aquí a través de Google así que sospecho que más gente pueda llegar aquí también.

El camino más corto, utilizando querySelectorAll y classList (lo que significa, visualización podría ser un problema: IE10 for classList y IE8 for querySelectorAll), y con duplicados, sería:

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 una reserva para classList (que tiene el soporte de navegador "más bajo") que también cuenta todos los elementos, todas las clases y todos los elementos con clases si no está usando classList.

No agregué una detección única, aunque podría llegar algún día.

+0

¡Gracias! Agradable para una solución reciente. JavaScript simple -> No requiere jQuery. –

0

Rápidamente clases de lista de consola (ignorando las clases angulares '*') ñg-

(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);

Cuestiones relacionadas