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

565

Есть ли способ в jQuery перебрать или назначить массиву все классы, которые назначены элементу?

ех.

<div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>

Я буду искать "специальный" класс, как в "dolor_spec" выше. Я знаю, что я мог бы использовать hasClass(), но фактическое имя класса может не обязательно быть известно в то время.

  • 0
    Если вы не знаете имя класса в то время, что мешает вам использовать hasClass (), как вы намереваетесь узнать, что это за массив?
  • 0
    Я разрабатываю форму, где я делаю предварительную проверку с помощью jQuery. Я добавляю id элемента input в список классов ошибки div, если она сгенерирована. Затем я делаю возможным щелкнуть по ошибке div, чтобы сфокусировать ошибочный элемент ввода. Этот скрипт будет использоваться для более чем одной формы. Поэтому я не хочу жестко кодировать идентификаторы в сценарии.
Показать ещё 3 комментария
Теги:

17 ответов

646
Лучший ответ

Вы можете использовать document.getElementById('divId').className.split(/\s+/);, чтобы получить массив имен классов.

Затем вы можете перебирать и находить тот, который вам нужен.

var classList = document.getElementById('divId').className.split(/\s+/);
for (var i = 0; i < classList.length; i++) {
    if (classList[i] === 'someClass') {
        //do something
    }
}

jQuery вам действительно не помогает...

var classList = $('#divId').attr('class').split(/\s+/);
$.each(classList, function(index, item) {
    if (item === 'someClass') {
        //do something
    }
});
  • 4
    это именно то, что я сделал, но я не был уверен, была ли функция сборки jQuery, которая дала бы вам коллекцию классов.
  • 35
    К вашему сведению: jQuery использует className.split (/ \ s + /)
Показать ещё 10 комментариев
217

Почему никто не просто перечисляет.

$(element).attr("class").split(' ');
  • 6
    Это часть принятого ответа ... Мне нужны были все классы, которые были применены к элементу.
  • 0
    Хаха, правда! Я хотел именно этого. Он возвращает строку классов, разделенных пробелами, поэтому, возможно, если вы захотите выбрать один из них, вы можете разделить строку на пробел и получить массив для выбора класса из
Показать ещё 9 комментариев
127

Вот плагин jQuery, который будет возвращать массив всех классов, в которых сопоставленный элемент имеет

;!(function ($) {
    $.fn.classes = function (callback) {
        var classes = [];
        $.each(this, function (i, v) {
            var splitClassName = v.className.split(/\s+/);
            for (var j = 0; j < splitClassName.length; j++) {
                var className = splitClassName[j];
                if (-1 === classes.indexOf(className)) {
                    classes.push(className);
                }
            }
        });
        if ('function' === typeof callback) {
            for (var i in classes) {
                callback(classes[i]);
            }
        }
        return classes;
    };
})(jQuery);

Используйте его как

$('div').classes();

В вашем случае возвращает

["Lorem", "ipsum", "dolor_spec", "sit", "amet"]

Вы также можете передать функцию методу, который будет вызываться для каждого класса

$('div').classes(
    function(c) {
        // do something with each class
    }
);

Вот jsFiddle, который я установил для демонстрации и тестирования http://jsfiddle.net/GD8Qn/8/

Миниатюрный Javascript

;!function(e){e.fn.classes=function(t){var n=[];e.each(this,function(e,t){var r=t.className.split(/\s+/);for(var i in r){var s=r[i];if(-1===n.indexOf(s)){n.push(s)}}});if("function"===typeof t){for(var r in n){t(n[r])}}return n}}(jQuery);
  • 0
    Идеально подходит для FullCalendar при копировании классов в атрибут className события.
114

В поддерживающих браузерах вы можете использовать элементы DOM classList.

$(element)[0].classList

Это массивный объект, перечисляющий все классы, которые имеет этот элемент.

Если вам нужно поддерживать старые версии браузера, которые не поддерживают свойство classList, связанная страница MDN также включает в себя прокладку для нее - хотя даже прокладка не будет работать в версиях Internet Explorer ниже IE 8.

  • 0
    Чистый ответ и не изобретать велосипед.
52

Вы должны попробовать следующее:

$("selector").prop("classList")

Он возвращает массив всех текущих классов элемента.

  • 0
    это гораздо точнее, чем принятый ответ, есть ли причина не использовать этот метод?
  • 5
    Ну, я не знаю. Но это правильный способ получить свойство из элемента DOM. И "classList" - это такое свойство, которое дает вам массив классов CSS, примененных к элементу.
Показать ещё 5 комментариев
14
var classList = $(element).attr('class').split(/\s+/);
$(classList).each(function(index){

     //do something

});
7
$('div').attr('class').split(' ').map(function(cls){ console.log(cls);})
  • 1
    Это ужасное злоупотребление .map ; используйте .each если вам не нужно возвращаемое значение .map . Разделение на пробелы, а не на любые пробелы, также нарушено - см. Мой комментарий на stackoverflow.com/a/10159062/1709587 . Даже если ни один из этих пунктов не был правдой, это не добавляет ничего нового на страницу. -1!
5

Update:

Как правильно заметил @Ryan Leonard, мой ответ на самом деле не исправляет то, что я сделал сам... Вам нужно как обрезать, так и удалить двойные пробелы с (например) string.replace(/+/g, "").. Или вы можете разделить имя el.className, а затем удалить пустые значения с помощью (например) arr.filter(Boolean).

const classes = element.className.split(' ').filter(Boolean);

или более современный

const classes = element.classList;

Старый:

Со всеми данными ответами вы никогда не должны забывать пользователя .trim() (или $.trim())

Поскольку классы добавляются и удаляются, может случиться, что между строкой класса существует несколько пробелов. 'class1 class2   class3 '..

Это превратилось бы в ['class1', 'class2', '', '', '', 'class3']..

При использовании обрезки удаляются все несколько пробелов.

  • 2
    Это неверно (а не ответ). И String.trim (), и $ .trim () удаляют все начальные и конечные пробелы и оставляют остальную часть строки в покое. jsconsole.com /?% 22% 20% 20a% 20% 20b% 20% 20% 22.trim ()
  • 0
    Вы даже взглянули на ответы? Все нативные решения JS не проверяли наличие начальных и конечных пробелов, что приводило к ошибочному списку классов, так как в массиве были бы пустые классы. JQuery делает то же самое с помощью trim, когда читает классы
Показать ещё 3 комментария
3

Возможно, это тоже поможет. Я использовал эту функцию для получения классов элемента childern.

function getClickClicked(){
    var clickedElement=null;
    var classes = null;<--- this is array
    ELEMENT.on("click",function(e){//<-- where element can div,p span, or any id also a class
        clickedElement = $(e.target);
        classes = clickedElement.attr("class").split(" ");
        for(var i = 0; i<classes.length;i++){
            console.log(classes[i]);
        }
        e.preventDefault();
    });
}

В вашем случае вы хотите, чтобы класс doler_ipsum u мог сделать это сейчас calsses[2];.

2

Попробуйте это. Это даст вам имена всех классов из всех элементов документа.

$(document).ready(function() {
var currentHtml="";
$('*').each(function() {
    if ($(this).hasClass('') === false) {
        var class_name = $(this).attr('class');
        if (class_name.match(/\s/g)){
            var newClasses= class_name.split(' ');
            for (var i = 0; i <= newClasses.length - 1; i++) {
                if (currentHtml.indexOf(newClasses[i]) <0) {
                    currentHtml += "."+newClasses[i]+"<br>{<br><br>}<br>"
                }
            }
        }
        else
        {
            if (currentHtml.indexOf(class_name) <0) {
                currentHtml += "."+class_name+"<br>{<br><br>}<br>"
            }
        }
    }
    else
    {
        console.log("none");
    }
});
$("#Test").html(currentHtml);

});

Вот рабочий пример: https://jsfiddle.net/raju_sumit/2xu1ujoy/3/

1

Спасибо за это - у меня была аналогичная проблема, так как я пытаюсь программно связать объекты с иерархическими именами классов, даже если эти имена могут не быть известны моему script.

В моем script мне нужен тег <a>, чтобы включить/отключить текст справки, указав тег <a> [some_class] плюс класс toggle, а затем предоставив ему текст помощи классу [some_class]_toggle. Этот код успешно находит связанные элементы с помощью jQuery:

$("a.toggle").toggle(function(){toggleHelp($(this), false);}, function(){toggleHelp($(this), true);});

function toggleHelp(obj, mode){
    var classList = obj.attr('class').split(/\s+/);
    $.each( classList, function(index, item){
    if (item.indexOf("_toggle") > 0) {
       var targetClass = "." + item.replace("_toggle", "");
       if(mode===false){$(targetClass).removeClass("off");}
       else{$(targetClass).addClass("off");}
    }
    });
} 
  • 0
    Спасибо Алан, я делаю что-то подобное, я удивлен, что не существует более простого способа сделать это.
  • 0
    - 1 - tl; dr, уходит по касательной, не имеющей прямого отношения к вопросу.
0

У меня была аналогичная проблема, для элемента изображения типа. Мне нужно было проверить, был ли элемент определенного класса. Сначала я попробовал:

$('<img>').hasClass("nameOfMyClass"); 

но я получил хороший "эта функция недоступна для этого элемента".

Затем я проверил свой элемент в DOM-проводнике, и я увидел очень хороший атрибут, который мог бы использовать: className. Он содержал имена всех классов моего элемента, разделенных пробелами.

$('img').className // it contains "class1 class2 class3"

Как только вы получите это, просто разделите строку как обычно.

В моем случае это сработало:

var listOfClassesOfMyElement= $('img').className.split(" ");

Я предполагаю, что это будет работать с другими типами элементов (кроме img).

Надеюсь, что это поможет.

0

javascript предоставляет атрибут classList для элемента node в dom. Просто используя

  element.classList

вернет объект формы

  DOMTokenList {0: "class1", 1: "class2", 2: "class3", length: 3, item: function, contains: function, add: function, remove: function…}

Объект имеет функции, такие как contains, add, remove, которые вы можете использовать

-2

Вопрос в том, что Jquery предназначен для этого.

$('.dolor_spec').each(function(){ //do stuff

И почему никто не дал . find() в качестве ответа?

$('div').find('.dolor_spec').each(function(){
  ..
});

Существует также классList для браузеров, отличных от IE:

if element.classList.contains("dolor_spec") {  //do stuff
  • 3
    - 1; среди других проблем ваши первые два фрагмента кода не связаны с заданным вопросом, а ваш последний фрагмент - синтаксическая ошибка.
-3

Я знаю, что это старый вопрос, но все же.

<div id="specId" class="Lorem ipsum dolor_spec sit amet">Hello World!</div>

var className=".dolor_spec" //dynamic

Если вы хотите управлять элементом

$("#specId"+className).addClass('whatever');

Если вы хотите проверить, имеет ли элемент класс

 $("#specId"+className).length>0

если несколько классов

//if you want to select ONE of the classes
var classNames = ['.dolor_spec','.test','.test2']
$("#specId"+classNames).addClass('whatever');
$("#specId"+classNames).length>0
//if you want to select all of the classes
var result = {className: ""};
classNames.forEach(function(el){this.className+=el;},result);
var searchedElement= $("#specId"+result.className);
searchedElement.addClass('whatever');
searchedElement.length>0
  • 1
    Ни один из этих фрагментов вообще не отвечает на заданный вопрос; -1.
-4

Здесь вы идете, просто измените readsquare ответ, чтобы вернуть массив всех классов:

function classList(elem){
   var classList = elem.attr('class').split(/\s+/);
    var classes = new Array(classList.length);
    $.each( classList, function(index, item){
        classes[index] = item;
    });

    return classes;
}

Передайте элемент jQuery функции, так что примерный вызов будет:

var myClasses = classList($('#myElement'));
  • 3
    Зачем перебирать массив classList, добавлять все элементы в массив классов и возвращать массив классов? Просто возвращение classList должно сделать то же самое, верно?
  • 0
    Нету. Поскольку мы имеем в виду ситуацию, когда существует много классов для одного и того же элемента. Если бы это было так просто, нас бы не было в этой теме :)
Показать ещё 1 комментарий
-4

Немного поздно, но с помощью функции extend() вы можете вызвать "hasClass()" для любого элемента, например:
var hasClass = $('#divId').hasClass('someClass');

(function($) {
$.extend({
    hasClass: new function(className) {
        var classAttr = $J(this).attr('class');
        if (classAttr != null && classAttr != undefined) {
            var classList = classAttr.split(/\s+/);
            for(var ix = 0, len = classList.length;ix < len;ix++) {
                if (className === classList[ix]) {
                    return true;
                }
            }
        }
        return false;
    }
}); })(jQuery);
  • 10
    Это был не вопрос.
  • 5
    Кроме того, jQuery имеет встроенную функцию начиная с версии 1.2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню