jQuery를 사용하여 요소의 클래스 목록 가져 오기


657

jQuery에서 요소에 할당 된 모든 클래스를 반복하거나 배열에 할당하는 방법이 있습니까?

전의.

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

위의 "dolor_spec"에서와 같이 "특별한"클래스를 찾고 있습니다. hasClass ()를 사용할 수는 있지만 실제 클래스 이름을 반드시 알 필요는 없습니다.


그 당시 클래스 이름을 모른다면 hasClass ()를 사용하지 못하게된다면 어떻게 배열에서 어떤 클래스 이름을 알고 싶습니까?
— doomspork

jQuery를 사용하여 예비 유효성 검사를 수행하는 양식을 설계 중입니다. 오류 div의 클래스 목록에 입력 요소의 ID를 추가하는 경우 추가합니다. 그런 다음 오류 div를 클릭하여 잘못된 입력 요소에 초점을 맞출 수 있습니다. 이 스크립트는 둘 이상의 양식에 사용됩니다. 따라서 스크립트에서 ID를 하드 코딩하고 싶지 않습니다.
— Buggabill

1
네, 왜 하드 코딩하고 싶지 않은지 이해합니다. 그러나 redsquare의 예제를 잠시 살펴보면 if 블록에 'someClass'를 하드 코딩해야한다는 것을 알 수 있습니다. 어느 쪽이든 변수를 사용하여 이것을 달성 할 수 있습니다.
— doomspork

class 속성을 사용하는 대신 네임 스페이스 내에 오류가있는 요소에 대한 DOM 참조를 포함하는 오류 목록 변수가있을 수 있습니다. 따라서 매번 속성 목록을 가져 와서 반복하고 DOM 요소를 찾아 초점을 맞출 필요가 없습니다.
— doomspork

답변:


732

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 함수에 클래스 모음을 제공하는 빌드가 있는지 확실하지 않습니다.
— Sander

36
참고 : jQuery는 className.split (/ \ s + /)를 사용합니다
— kͩeͣmͮpͥ

70
jQuery 플러그인을 직접 추가하십시오 :$.fn.classList = function() {return this[0].className.split(/\s+/);};
— ripper234

1
또는 다음을 수행 할 수 있습니다. if ($.inArray("someclass",classList)>=0) { /* hasClass someclass*/ }
— sambomartin

자바 스크립트 전문가가 아닙니다. split ( "")를하는 것보다 split (/ \ s + /)가 더 나은지 말해 주실 수 있습니까? FF23 / Chrome28 / IE8에서도 동일하게 작동합니다.
— Roberto Linares

288

왜 아무도 단순히 나열되지 않았습니다.

$(element).attr("class").split(/\s+/);

편집 : @MarkAmery가 지적했듯이 .split(' ')클래스 이름을 공백으로 분리 할 수 ​​없기 때문에 할 수 없습니다 .


6
그것은 받아 들인 대답의 일부입니다 ... 요소에 적용된 모든 클래스가 필요했습니다.
— Buggabill

54
잘못 되었기 때문에! 클래스는 모든 종류의 공백으로 분리 할 수 ​​있습니다 (예 : HTML의 긴 클래스 속성을 여러 줄로 줄 바꿈 할 수 있음).이 답변은이를 설명하지 않습니다. $('<div class="foo bar baz">').attr("class").split(' ')브라우저 콘솔에 붙여 넣으 십시오 (탭 문자가 있음). ["foo", "bar baz"]의 올바른 수업 목록 대신 에을 얻을 수 ["foo", "bar", "baz"]있습니다.
— Mark Amery

2
@MarkAmery가 맞습니다. 가 있으면 class="foo <lots of spaces here> bar"빈 문자열 요소가있는 배열로 끝납니다.
— Jacob van Lingen

4
99 %의 경우에이 솔루션이 효과적이라고 생각합니다. 즉, HTML을 제어하는 ​​중입니다. HTML 표준에서 허용하는 경우에도 클래스 이름 사이에 탭이나 여러 공백이 있어야한다는 이유를 생각할 수 없습니다.
— Gordon Rouse

5
@GordonRouse 클래스 목록에 들어온 여분의 공간은 매우 일반적이며, 특히 어떤 종류의 논리가 클래스 목록을 작성하는 경우에 특히 그렇습니다.
— Eric

142

지원되는 브라우저에서 DOM 요소의 classList속성을 사용할 수 있습니다 .

$(element)[0].classList

요소가 가진 모든 클래스를 나열하는 배열과 같은 객체입니다.

이 classList속성을 지원하지 않는 이전 브라우저 버전을 지원해야하는 경우 연결된 MDN 페이지에도 해당 shim이 포함됩니다. 비록 shim도 IE 8 이하의 Internet Explorer 버전에서는 작동하지 않습니다.


깨끗하게 대답하고 바퀴를 재발 명하지 않습니다.
— Marco Sulla

@Marco Sulla : 이것은 구식 소프트웨어에 대한 지원 이외의 단점이 있습니다. .classList는 실제 배열 .indexOf(⋯)이 아니며 작동하지 않는 방법과 같습니다 . .className.split(/\s+/).indexOf(⋯)(허용 된 답변에서) 작동하는 반면 "배열과 같은 객체" 입니다.
— Incnis Mrsi

당신은 쉽게 모든 반복자를 변환 할 수 있습니다 Array사용 [...iterable]또는Array.from(iterable)
— 마르코 술라

142

다음은 일치하는 요소가 가진 모든 클래스의 배열을 반환하는 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
    }
);

다음은 http://jsfiddle.net/GD8Qn/8/ 을 보여주고 테스트하기 위해 설정 한 jsFiddle입니다.

축소 된 자바 스크립트

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

클래스를 이벤트 의 className 속성에 복사 할 때 FullCalendar에 적합합니다 .
— Dan Power

78

이것을 시도해야합니다 :

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

요소의 모든 현재 클래스의 배열을 리턴합니다.


이것은 받아 들일만한 대답보다 훨씬 깔끔합니다.이 방법을 사용하지 않을 이유가 있습니까?
— RozzA

5
글쎄요 그러나 이것은 DOM 요소에서 속성을 얻는 적절한 방법입니다. "classList"는 요소에 적용된 CSS 클래스 배열을 제공하는 속성입니다.
— P.Petkov

@RozzA 어쩌면 당시에는 사용할 수 없었습니까? 그러나 간단한 .classList해결책 인 jQuery를 사용하지 않는 한 이것이 현재 가장 적합한 방법이라고 말하고 싶습니다. 불일치 및 / 또는 누락 된 브라우저 지원에주의를 기울여야합니다.
— Dennis98

@ Dennis98 좋은 전화, 나는 최근에 얼마나 빨리 새로운 기능이 나왔는지 잊어 버립니다. 또한 .classList현대적인 브라우저에서 잘 작동하는 일반 js를 수행 했습니다
— RozzA

1
classListSVG 요소의 경우 IE 10/11에서는 이 속성이 작동하지 않습니다 (HTML 요소에서는 작동하지만). developer.mozilla.org/en-US/docs/Web/API/Element/classList
— Métoule

17
var classList = $(element).attr('class').split(/\s+/);
$(classList).each(function(index){

     //do something

});

7

최신 정보:

@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 ()
— Ryan Leonard

답을 보셨나요? 이 클래스를 읽을 때 모든 기본 JS 솔루션은 배열에 빈 클래스가있을 것으로하여, 잘못된 클래스 목록을 제공, 선도 및 공백을 후행 확인하지 않았다 .. jQuery를 내부 트림과 같은 일
— DutchKevv

2
다른 답변을 보았고 클래스 이름 사이에 공백을 제거해야한다는 데 동의합니다. 나는 a) 이것은 완전한 해결책이 아니기 때문에 다른 솔루션에 대한 의견이어야한다고 지적했다. b. .trim ()은 필요한 공간을 확보하기 위해 여러 공간을 제거 하지 않습니다 .
— Ryan Leonard

1
당신은 정말로 정확합니다 ... 내 빠른 의견에 대해 죄송합니다. 사이에 공백을 제거하지 않습니다 ... s.trim (). replace (/ + / g, "") 또는 무언가가 필요할 것입니다 그 사이에, el.classList는 거의 광범위하게 지원되어, 내가
— 생각한

1
전혀 문제 없습니다. 행복하게 upvoted, .classList훨씬 깨끗한 접근 방식입니다!
— Ryan Leonard

7
$('div').attr('class').split(' ').each(function(cls){ console.log(cls);})

2
이것은 끔찍한 학대입니다 .map. 의 반환 값이 .each필요하지 않은 경우 사용 하십시오 .map. 공백이 아닌 공백으로 분할하는 것도 깨졌습니다 . stackoverflow.com/a/10159062/1709587 에 대한 내 의견을 참조하십시오 . 이러한 사항 중 하나라도 해당되지 않더라도 페이지에 새로운 내용이 추가되지 않습니다. -1!
— Mark Amery

3

이것이 당신에게도 도움이 될 수 있습니다. 나는이 함수를 사용하여 자식 요소의 클래스를 얻었습니다.

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

이것에 감사드립니다-프로그래밍 방식으로 객체를 계층 적 클래스 이름과 관련 시키려고 시도하기 때문에 비슷한 문제가 발생했습니다.이 이름은 반드시 스크립트에 알려지지 않았을 수도 있습니다.

내 스크립트 <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");}
    }
    });
} 

감사합니다 Alan, 나는 비슷한 일을하고 있습니다.이 작업을 수행하는 더 간단한 방법이 없다는 것에 놀랐습니다.
— Eric Kigathi

-1-tl; dr, 질문과 직접 ​​관련이없는 접선을 떠납니다.
— Mark Amery

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

이미지 유형의 요소에 대해서도 비슷한 문제가 있습니다. 요소가 특정 클래스인지 확인해야했습니다. 먼저 나는 다음을 시도했다.

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

하지만 좋은 "이 기능에는이 기능을 사용할 수 없습니다"가 있습니다.

그런 다음 DOM 탐색기에서 요소를 검사하고 className이라는 매우 유용한 속성을 보았습니다. 그것은 내 요소의 모든 클래스의 이름을 공백으로 구분하여 포함했습니다.

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

일단 이것을 얻으면 평소대로 문자열을 나눕니다.

내 경우에는 이것이 효과가 있었다.

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

나는 이것이 다른 종류의 요소 (img 외에도)와 함께 작동한다고 가정합니다.

도움이 되길 바랍니다.


0

javascript는 dom의 노드 요소에 대한 classList 속성을 제공합니다. 간단히 사용

  element.classList

형태의 객체를 반환합니다

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

객체에는 포함, 추가, 제거 등의 기능이 있습니다.


3 년 전에 게시 된 stackoverflow.com/a/5457148/1709587의 열등한 사본 ; -1.
— Mark Amery

-3

약간 늦었지만 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
그것은 질문이 아니 었습니다.
— Tomas

5
또한 jQuery에는 1.2 버전부터이 기능이 내장되어 있습니다.
— 앤드류

-3

문제는 Jquery가 수행하도록 설계된 것입니다.

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

그리고 왜 아무도 .find () 를 대답으로 제공하지 않았 습니까?

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

비 IE 브라우저를위한 classList도 있습니다 :

if element.classList.contains("dolor_spec") {  //do stuff

3
-1; 다른 문제 중에서, 처음 두 코드 스 니펫은 질문과 관련이 없으며 최종 스 니펫은 구문 오류입니다.
— Mark Amery

-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를 반환하면 동일한 트릭을 수행해야합니다.
— Martijn

아니. 동일한 요소에 대해 많은 클래스가있는 상황을 언급하고 있기 때문에. 너무 쉬웠다면, 우리는이 스레드에 없었습니다 :)
— Gregra

8
이 스레드는 클래스 목록을 반환하는 것 $(elem).attr('class').split(/\s+/)입니다. 단순히 반환 하면됩니다. 어쩌면 내가 잘못 착각하고 있지만 컬렉션을 반복하고 내용을 새 컬렉션에 복사 한 다음 새 컬렉션을 반환해야 할 이유가 없습니다.
— Martijn

-4

나는 이것이 오래된 질문이지만 여전히 알고 있습니다.

<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.
— Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.