JQuery получить определенные классы, но не другие - PullRequest
5 голосов
/ 18 октября 2011

У меня есть div, который выглядит как

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

Позиции в произвольном порядке. Если я сделаю $('div').attr('class'), я получу список всех классов для этого div. Я хочу получить только те классы, которые не resizable, draggable или table. В этом случае я хочу abc shadow. Как мне это сделать.

Ответы [ 8 ]

4 голосов
/ 18 октября 2011

Плагин:

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

Использование:

var classes = $('div').getClasses(['resizable', 'draggable', 'table']);
4 голосов
/ 18 октября 2011
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"]

Обратите внимание, что вам не нужен второй replace (вам не нужно убирать начальные и конечные пробелы), если все, что вам нужно, это строка, которая подходит для установки className в.

Но тогда, если вы пытаетесь просто удалить набор известных классов из элемента, лучше просто:

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

Альтернатива (без использования регулярных выражений):

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"
1 голос
/ 18 октября 2011
        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;
    }
1 голос
/ 18 октября 2011

@ Phrogz - хороший ответ. По всей видимости, он мастер регулярных выражений. Так как я не знаю регулярных выражений, вот мое мнение:

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

Вот рабочая скрипка для иллюстрации .

0 голосов
/ 18 октября 2011

посмотрите на это jsFiddle , у меня что-то работает, как вы хотели.

Кроме того, посмотрите на jQuery: не селекторы

0 голосов
/ 18 октября 2011
var classes = $('div').not('.resizable, .draggable, .table').attr('class').split(' ');
0 голосов
/ 18 октября 2011

Здесь ответили. Получить список классов для элемента с jQuery .

Вы можете расширить это, чтобы получить строки в массиве, которые не являются "изменяемыми размерами, перетаскиваемыми или табличными"

0 голосов
/ 18 октября 2011

Вы можете проверить отдельные классы, используя .hasClass.

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