특정 문자열로 시작하는 모든 클래스 제거


99

id="a"여러 그룹에서 여러 클래스를 연결할 수 있는 div가 있습니다. 각 그룹에는 특정 접두사가 있습니다. 자바 스크립트에서 그룹의 어떤 클래스가 div에 있는지 모르겠습니다. 주어진 접두사가있는 모든 클래스를 지운 다음 새 클래스를 추가 할 수 있기를 원합니다. "bg"로 시작하는 모든 클래스를 제거하려면 어떻게해야합니까? 이와 비슷하지만 실제로 작동합니다.

$("#a").removeClass("bg*");

답변:


59

jQuery를 사용하면 실제 DOM 요소가 인덱스 0에 있으므로 작동합니다.

$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');

34
이것에주의하세요. 단어 경계는 대시 문자 ( '-')와 점 등으로 분할되므로 "bg.a", "bg-a"등과 같은 클래스 이름은 제거되지 않고 ".a", "-a"등으로 대체됩니다. 따라서 구두점 문자가있는 클래스 이름이있는 경우 간단한 정규식 바꾸기를 실행하여 문제가 발생할 수 있습니다. 여기에 SO 스레드입니다 단어 경계 정의에 대한이
— 야쿱 P.

6
split ( '') 및 indexOf를 사용한 Kabir Sarin의 답변은 특수 문자 "zombie"클래스가 팝업되지 않기 때문에 더 나은 IMO입니다.
— Jakub P.

2
이 방법은 다음과 같이 더 나은 정규식과 함께 사용할 수 있습니다. stackoverflow.com/a/2644364/1333402
— ssmith

109

단어 경계에서 정규식 분할 \b은 이에 대한 최상의 솔루션이 아닙니다.

var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
    return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ").trim();

또는 jQuery 믹스 인으로 :

$.fn.removeClassPrefix = function(prefix) {
    this.each(function(i, el) {
        var classes = el.className.split(" ").filter(function(c) {
            return c.lastIndexOf(prefix, 0) !== 0;
        });
        el.className = $.trim(classes.join(" "));
    });
    return this;
};

2018 ES6 업데이트 :

const prefix = "prefix";
const classes = el.className.split(" ").filter(c => !c.startsWith(prefix));
el.className = classes.join(" ").trim();

9
이것은 '좀비 클래스'가 팝업되는 것을 방지하기 때문에 \ b (단어 경계 검사)와 함께 RegExp를 사용하는 것보다 더 나은 접근 방식입니다. "prefix-suffix"와 같은 클래스가있는 경우이 스레드의 'best answer'는 '-suffix'클래스를 남깁니다. \ b는 '-'문자보다 먼저 분할되기 때문입니다. 분할 맵 조인 솔루션이 작동합니다. :) 솔루션 Kabir 주위에 작은 jQuery 플러그인을 만들었습니다. ( gist.github.com/2881585 )
— Jakub P.

3
+1 저도 동의합니다. 다른 모든 대답은 공백이 아닌 단어 경계를 깨뜨리는 단순한 정규식 인 것처럼 보입니다. 내일 시간이 있으면 이것을 증명하는 단위 테스트를 제공하겠습니다.
— -06-14

1
익명 함수 filter가 부울을 반환해야하기 때문에 실제로 유효한 코드는 아니지만 좋아합니다 . 작동합니다 :var classes = $(e).attr("class").split(" "); $(classes).each(function(i, item) { classes[i] = item.indexOf("prefix") === -1 ? item : "prefix-new"); }); $(e).attr("class", classes.join(" "));
— Tim

더 유효한 솔루션을 사용하는지도 :$e.attr('class', $.map($e.attr('class').split(' '), function (klass) { return klass.indexOf(prefix) != 0 ? klass : undefined; }).join(' '));
— M 밀러

2
이 접근 방식이 가장 효과적입니다. @JakubP의 플러그인을 사용했습니다. 내가 할 수 있다면 한 가지 제안 : 그것이 무엇을하는지, 이제 클래스를 반환하면 많은 공간이 발생합니다. 예를 들어 class="blackRow blackText orangeFace blackHead"반환합니다 class=" orangeFace "실행할 경우 removeClassPrefix("black");. 결과를 다음과 같이 트리밍하여이 문제를 해결했습니다 el.className = $.trim(classes.join(" "));..
— 알버트

29

와일드 카드 클래스 제거를 수행 하는 간단한 jQuery 플러그인-alterClass를 작성했습니다 . 선택적으로 클래스도 추가합니다.

$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) 

감사합니다 Pete! 방금 플러그인을 사용했고 훌륭하게 작동합니다 ... 시간을 절약했습니다!
— jordan.baucke 2012 년

11

이를 처리하기 위해 jQuery 특정 코드가 필요하지 않습니다. RegExp를 사용하여 대체하십시오.

$("#a").className = $("#a").className.replace(/\bbg.*?\b/g, '');

접두사를 지원하도록 수정할 수 있지만 RegExp가 한 번만 컴파일되므로 더 빠른 방법이 위에 있습니다.

function removeClassByPrefix(el, prefix) {
    var regx = new RegExp('\\b' + prefix + '.*?\\b', 'g');
    el.className = el.className.replace(regx, '');
    return el;
}

9

사용 2 차 서명 의를 $.fn.removeClass:

// Considering:
var $el = $('<div class="  foo-1 a b foo-2 c foo"/>');

function makeRemoveClassHandler(regex) {
  return function (index, classes) {
    return classes.split(/\s+/).filter(function (el) {return regex.test(el);}).join(' ');
  }
}

$el.removeClass(makeRemoveClassHandler(/^foo-/));
//> [<div class=​"a b c foo">​</div>​]

jQuery v1.4부터 이것이 최선의 접근 방식입니다.
— Dinei 2015 년

3

http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html 내용 :

... 그리고 .removeClass ()는 모든 클래스를 제거합니다 ...

그것은 나를 위해 작동합니다;)

건배


이것은 더 나은 선택입니다! 공장.
— Afshin Mehrabani 2012-06-30

12
이 질문은 모든 클래스를 제거하는 방법을 묻는 것이 아니라 특정 문자열로 시작하는 모든 클래스를 제거하는 방법을 묻습니다. 이 두 가지는 매우, 매우 다릅니다.
— Chris Harrison

3

간단한 jQuery 구문과 배열 처리 함수를 사용하여 사용하는 접근 방식은 컨트롤의 ID와 클래스의 접두사를 취하고 모든 클래스를 삭제하는 함수를 선언하는 것입니다. 코드가 첨부되어 있습니다.

function removeclasses(controlIndex,classPrefix){
    var classes = $("#"+controlIndex).attr("class").split(" ");
    $.each(classes,function(index) {
        if(classes[index].indexOf(classPrefix)==0) {
            $("#"+controlIndex).removeClass(classes[index]);
        }
    });
}

이제이 함수는 어디에서나 버튼을 클릭하거나 코드에서 호출 할 수 있습니다.

removeclasses("a","bg");

2

나는 똑같은 문제에 대한 해결책을 찾고있었습니다. 접두사 "fontid_"로 시작하는 모든 클래스를 제거하려면이 기사를 읽은 후 지금 사용하고있는 작은 플러그인을 작성했습니다.

(function ($) {
        $.fn.removePrefixedClasses = function (prefix) {
            var classNames = $(this).attr('class').split(' '),
                className,
                newClassNames = [],
                i;
            //loop class names
            for(i = 0; i < classNames.length; i++) {
                className = classNames[i];
                // if prefix not found at the beggining of class name
                if(className.indexOf(prefix) !== 0) {
                    newClassNames.push(className);
                    continue;
                }
            }
            // write new list excluding filtered classNames
            $(this).attr('class', newClassNames.join(' '));
        };
    }(fQuery));

용법:

$('#elementId').removePrefixedClasses('prefix-of-classes_');

이것은 10 배 더 많은 라인과 덜 효율적인 "문자열 시작"체크를 가진 내 솔루션에 지나지 않습니다 :-/
— sarink

2

최신 브라우저의 경우 :

let element = $('#a')[0];
let cls = 'bg';

element.classList.remove.apply(element.classList, Array.from(element.classList).filter(v=>v.startsWith(cls)));

1

오래된 질문이라는 것을 알고 있지만 새로운 해결책을 찾았고 단점이 있는지 알고 싶습니다.

$('#a')[0].className = $('#a')[0].className
                              .replace(/(^|\s)bg.*?(\s|$)/g, ' ')
                              .replace(/\s\s+/g, ' ')
                              .replace(/(^\s|\s$)/g, '');

1

한 줄에 ... someRegExp 정규식과 일치하는 모든 클래스를 제거합니다.

$('#my_element_id').removeClass( function() { return (this.className.match(/someRegExp/g) || []).join(' ').replace(prog.status.toLowerCase(),'');});

0

Prestaul의 답변은 도움이되었지만 저에게는 효과적이지 않았습니다. id로 객체를 선택하는 jQuery 방법이 작동하지 않았습니다. 나는 사용해야했다

document.getElementById("a").className

대신에

$("#a").className

또는 $ ( "# a") [0] .className as className은 (는) jQuery 개체가 아닌 DOM 요소에서만 사용할 수 있습니다.
— Naeem Sarfraz

이없는 답변, 누군가의 답변에 대한 코멘트입니다
— TJ

0

또한 클래스 이름에 하이픈 '-'과 숫자를 사용합니다. 그래서 내 버전에는 '\ d-'가 포함됩니다.

$('#a')[0].className = $('#a')[0].className.replace(/\bbg.\d-*?\b/g, '');

0
(function($)
{
    return this.each(function()
    {
        var classes = $(this).attr('class');

        if(!classes || !regex) return false;

        var classArray = [];

        classes = classes.split(' ');

        for(var i=0, len=classes.length; i<len; i++) if(!classes[i].match(regex)) classArray.push(classes[i]);

        $(this).attr('class', classArray.join(' '));
    });
})(jQuery);

-6
$("#element").removeAttr("class").addClass("yourClass");

3
나는 당신이 질문을 잘 읽지 않았다고 생각합니다. 사용자는 단순히 클래스를 제거하고 다른 클래스를 추가하는 것에 대해 묻지 않았습니다.
— Andrew Barber

1
앤드류 바버 : 당신이 정답 아니다 맞아,하지만 majorsk8는 단지 하나 하나를 모든 클래스 (removeAttr)를 삭제하는 방법을 제안)
— 틸트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.