特定の文字列で始まるすべてのクラスを削除します


99

私はid="a"いくつかのグループから、それに接続されている任意の数のクラスを持つことができるdivを持っています。各グループには特定のプレフィックスがあります。JavaScriptでは、グループのどのクラスが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」などに置き換えられます。 。したがって、句読文字を含むクラス名がある場合、単純な正規表現置換を実行するだけで問題が発生する可能性があります。これが単語境界の定義に関する
JakubP。

6
以下のsplit( '')とindexOfを使用したKabir Sarinの回答は、これらの特殊な「ゾンビ」クラスがポップアップ表示されないため、より良いIMOです。
Jakub P.

2
このメソッドはまだ良い正規表現を使用することができ、1等はこちらをご覧ください: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
これは、「ゾンビクラス」がポップアップするのを防ぐため、RegExpを\ b(単語境界チェック)とともに使用するよりも優れたアプローチです。「prefix-suffix」のようなクラスがある場合、\ bは「-」文字の前に分割されるため、このスレッドの「ベストアンサー」はクラス「-suffix」を離れます。あなたの分割マップ-参加解決策は、私はあなたのソリューション、カビールの周りの小さなjQueryプラグインを作成した:)ことを回避します:(gist.github.com/2881585
ヤクブP.

3
+1私も同意します。他のすべての回答は、スペース以外の単語の境界で分割される単純な正規表現のように見えます。明日の時間があれば、これを証明する単体テストを提供します。
2012年

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のプラグインを使用しました。私がするかもしれないことの1つの提案:それが今クラスを返すとき、それは何をするのですか?たとえば、を実行class="blackRow blackText orangeFace blackHead"すると戻りclass=" orangeFace "ますremoveClassPrefix("black");。私はそのように結果をトリミングすることでこれを解決しました:el.className = $.trim(classes.join(" "));
アルバート、

29

ワイルドカードクラスの削除を行う単純なjQueryプラグイン-alterClassを作成しました。オプションでクラスも追加します。

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

ピート、ありがとう!プラグインを使用するだけでうまくいきます...時間を節約できました!
jordan.baucke

11

これを処理するためにjQuery固有のコードは必要ありません。RegExpを使用してそれらを置き換えるだけです。

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

これを変更して任意のプレフィックスをサポートできますが、RegExpは1回だけコンパイルされるため、より高速な方法が上にあります。

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

3

http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html言う:

...そして.removeClass()はすべてのクラスを削除します...

わたしにはできる ;)

乾杯


これはより良い選択です!動作します。
Afshin Mehrabani 2012年

12
質問は、すべてのクラスを削除する方法を尋ねるのではなく、特定の文字列で始まるすべてのクラスを削除する方法を尋ねます。これら2つは非常に異なります。
クリスハリソン

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]);
        }
    });
}

これで、この関数はボタンのonclickまたはコードからどこからでも呼び出すことができます。

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倍の行数と「文字列の
先頭

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

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はDOM要素としないjQueryオブジェクトでのみ利用可能である
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
@Andrew Barber:そうですね、これは正しい答えではありませんが、majorsk8は、1つだけではなく、すべてのクラス(removeAttr)をクリアする方法を提案しました;)
Tilt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.