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


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.