jQuery recibe ciertas classs pero no otras

Tengo un div que se parece a

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

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

 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 count que no necesita el segundo replace (no es necesario quitar el espacio en blanco inicial y posterior) si lo único que desea es una cadena que sea apropiada para establecer className .

Pero entonces, si estás tratando de eliminar un set de classs 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" 

Un complemento:

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

La respuesta de @Phrogz es buena. Aparentemente, él es un experto en regex. Como no sé muy bien la expresión regular, esta es mi opinión:

 var aryClasses = $("div").attr("class").split(" "); var aryDesinetworkingClasses = new Array(); for(var i = 0; i < aryClasses.length; i++) { if(aryClasses[i] != "table" && aryClasses[i] != "resizable" && aryClasses[i] != "draggable") aryDesinetworkingClasses.push(aryClasses[i]); } alert(aryDesinetworkingClasses.join(" ")); 

Aquí hay un violín de trabajo para ilustrar .

  function getDesinetworkingClass( removedClassArr ){ var classArray = $("selector").attr('class').split(" "); var desinetworkingClassArray = []; for(var i = 0; i < classArray.length; i++ ){ if ( !isUnDesinetworkingClass(removedClassArr, classArray[i]) ){ desinetworkingClassArray .push( classArray[i] ); } } return desinetworkingClassArray; } function isUnDesinetworkingClass( removedClassArr , cls){ for(var i = 0; i < removedClassArr.length; i++ ){ if( removedClassArr[i] == cls ){ return true; } } return false; } 

Puede verificar las classs individuales usando .hasClass .

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

Esto fue respondido aquí. Obtiene la list de classs para el elemento con jQuery .

Puede ampliar esto para get solo las cadenas en la matriz que no son "networkingimensionables, arrastrables o de tabla"

 var classes = $('div').not('.resizable, .draggable, .table').attr('class').split(' '); 

echa un vistazo a este jsFiddle , tengo algo que funciona como lo que querías.

Además, eche un vistazo a jQuery: no selectores