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.