2011-10-18 12 views
5

tengo un div que se parece ajQuery obtener ciertas clases pero no en otros

<div class="draggable resizable abc table shadow"></div> 

Clases están en ningún orden específico. Si hago $('div').attr('class') entonces obtengo una lista de todas las clases para ese div. Lo que quiero es solo obtener clases que no sean resizable, draggable o table. En este caso quiero abc shadow. Cómo hago esto.

+0

Así que desea que los nombres de las clases reales, no los elementos HTML? –

+2

Consejo: Obtendrá mejores respuestas si explica lo que quiere hacer en lugar de (o además de) preguntar sobre una forma en que cree que podría lograrlo. ¿Por qué quieres una lista de clases menos las demás? (¿Qué vas a hacer con ellos?) – Phrogz

Respuesta

4
var all = "draggable resizable abc table shadow"; 
var some = all.replace(/(?:^|\s)(resizable|draggable|table)(?=\s|$)/g, ''); 

console.log(some); 
// " abc shadow" 

console.log(some.replace(/^\s+|\s+$/g,'')); 
// "abc shadow" 

console.log(some.split(/\s+/)); 
// ["", "abc", "shadow"] 

Tenga en cuenta que no es necesario el segundo replace (que no es necesario quitarse espacio inicial y final) si lo que quieres es una cadena que es apropiado para el ajuste del className a.

Pero entonces, si usted está tratando de eliminar sólo un conjunto de clases conocidas de un elemento, mucho mejor simplemente:

$(...).removeClass("draggable resizable table"); 

Alternativa (sin necesidad de una expresión regular):

var ignore = {resizable:1, draggable:1, table:1}; 
var all = "draggable resizable abc table shadow".split(' '); 
for (var subset=[],i=all.length;i--;) if (!ignore[all[i]]) subset.push(all[i]); 

console.log(subset); 
// ["shadow","abc"] 

console.log(subset.join(' ')); 
// "shadow abc" 
+0

Gracias, pero estoy recibiendo una coma antes de cada clase ', abc, shadow' Quiero un espacio después de cada clase para que se vea como' abc shadow' – Pinkie

+0

@Pinkie: 'some.split (/ \ s + /)' devuelve un formación. Puede concatenar sus elementos de la forma que desee. –

+0

Salir de la división le dará una cadena delimitada por espacios adecuada para configurar la clase (si eso es lo que está tratando de hacer). – Phrogz

0

Puede verificar las clases individuales usando .hasClass.

$("div").hasClass("class"); 
+7

esto no responde a la pregunta – Pinkie

+0

Es una tentativa de proporcionar una mejor solución que lo que estás haciendo. Debería decirnos el problema subyacente para que podamos ofrecer una mejor solución. –

0

Esto fue respondido aquí. Get class list for element with jQuery.

Se puede extender este para obtener sólo las cadenas de la matriz que no son "de tamaño variable, que pueden arrastrarse o mesa"

+0

Esto es irrelevante para la pregunta. – Pinkie

+0

No estoy seguro de por qué cree que esto es irrelevante para la pregunta. La publicación referenciada proporciona una forma de obtener todos los nombres de clase del elemento y los rellena en una matriz. Luego tomas esa matriz y analizas las 3 clases que no quieres. –

+0

Para mejorar su respuesta, probablemente debería adaptar el código que se encuentra en esa respuesta a la pregunta en lugar de simplemente vincularlo. –

1

@Phrogz respuesta es una buena. Aparentemente, él es un experto en regex. Dado que no sé de expresiones regulares que bueno, aquí está mi opinión sobre ella:

var aryClasses = $("div").attr("class").split(" "); 
var aryDesiredClasses = new Array(); 

for(var i = 0; i < aryClasses.length; i++) { 
    if(aryClasses[i] != "table" 
        && aryClasses[i] != "resizable" 
        && aryClasses[i] != "draggable") 
     aryDesiredClasses.push(aryClasses[i]); 
} 

alert(aryDesiredClasses.join(" ")); 

Aquí es a working fiddle to illustrate.

+1

Creo que quiere la negación ('if (aryClasses [i]! =" Resizable "|| ...)') en lugar de simplemente coincidir exactamente con las clases conocidas. – Phrogz

+0

@Phrogz, tienes toda la razón. Actualizado. –

4

Un plugin:

(function($) { 
    $.fn.getClasses = function(exclude) { 
     var remove = {}; 

     for(var i = exclude.length; i--;) { 
      remove[exclude[i]] = true; 
     } 

     return $.map(this.attr('class').split(/\s+/g), function(cls) { 
      return remove[cls] ? null : cls; 
     }); 
    }; 
}(jQuery)); 

Uso:

var classes = $('div').getClasses(['resizable', 'draggable', 'table']); 
+0

Agradable. +1 por mostrarme que '$ .map' junto con' null' autocompacta el resultado. (Personalmente podría cambiar el nombre del método a 'getClassesWithout', pero eso es más preferencia que cualquier otra cosa). – Phrogz

+2

@Josh: No estoy seguro de por qué lo hizo, pero no cambia nada y, de hecho, JSLint prefiere el otro camino. –

+0

@FelixKling ¡Qué mal, estás en lo cierto, a primera vista pensé que era un error tipográfico! –

1
 function getDesiredClass(removedClassArr){ 
      var classArray = $("selector").attr('class').split(" "); 
      var desiredClassArray = []; 
      for(var i = 0; i < classArray.length; i++){ 
       if (!isUnDesiredClass(removedClassArr, classArray[i])){ 
        desiredClassArray .push(classArray[i]); 
       } 
      } 
      return desiredClassArray; 
     } 
     function isUnDesiredClass(removedClassArr , cls){ 
     for(var i = 0; i < removedClassArr.length; i++){ 
      if(removedClassArr[i] == cls){ 
       return true; 
      } 
     } 
     return false; 
    } 
0
var classes = $('div').not('.resizable, .draggable, .table').attr('class').split(' '); 
0

echar un vistazo a este jsFiddle, tengo algo de trabajo al igual que lo que quería.

También, echar un vistazo a jQuery :not selectors

+0

Esto no es para nada lo que el OP está pidiendo ... –

Cuestiones relacionadas