jQuery removeClassワイルドカード


370

たとえば、一致するすべてのクラスを削除する簡単な方法はありますか?

color-*

だから私が要素を持っているなら:

<div id="hello" class="color-red color-brown foo bar"></div>

取り外した後、

<div id="hello" class="foo bar"></div>

ありがとう!


1
「受け入れられた答え」のような正規表現は、スペース以外の単語の境界で壊れます。以下に代替ソリューションを投稿しました。また、stackoverflow.com
questions / 57812 /…

@KabirSarin受け入れられた回答は、これを修正するために更新されています。
Emile Bergeron、2016

css wildcardssurfingsuccess.com/css/…–
Max Hodges

回答:


679

removeClassの機能があるため、関数の引数を取るjQueryの1.4

$("#hello").removeClass (function (index, className) {
    return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});

ライブの例:http : //jsfiddle.net/xa9xS/1409/


4
これは、最初から始まらない、一致するクラスの先頭の空白をキャプチャすることに注意する価値があると思いました。JavaScriptは肯定的な後読みをサポートしていないため、キャプチャグループを使用する必要があります。ただし、removeClass関数はクラス文字列から空白を削除するので、これは問題ではありませんclasses = ( value || "" ).match( rnotwhite ) || [];
eephillip

私はこのソリューションが一番好きです!削除する2つ以上のクラスを確認するにはどうすればよいですか?すなわちsport-nav-そしてcolor-
lowtechsun 2016

次のように終わるクラスに一致させるにはどうすればよい*-colorですか?
サークルB

3
@lowtechsunあなたはこのようにあなたの正規表現を追加することができます(color-|sport-|nav-)。それはcolor-、またはsport-、またはに一致しnav-ます。したがって、上記の答えはになり/(^|\s)(color-|sport-|nav-)\S+/gます。
ボギー

1
受け入れられた答えは正しいですが、慣用的には、より単語の多い(^ | \ s)ではなく、任意の単語の境界に一致する\ bを使用します。したがって、たとえば、magicという単語とそれに続く非負の整数からなるすべてのクラスとそれらのみを削除するには、/ \ bmagic \ d + \ b /で照合します。
CarlEdman 2016

98
$('div').attr('class', function(i, c){
    return c.replace(/(^|\s)color-\S+/g, '');
});

5
オーバーヘッドが減り、要点がまっすぐになるので、これが好きです。attrが仕事を改善するのに、なぜクラスを削除するのですか?
Angry Dan

2
空のクラス(c is undefined)から保護する必要があると思いますか?少なくとも、このページのプラグイン以下を試したところ、$('a').stripClass('post', 1)「TypeError:undefinedのメソッド 'replace'を
呼び出せ

1
@Kobiええ、私は属性でフィルタリングしてそれを持たない結果を返すことは可能ではないと思います- 値があるかどうかに関わらず、を持つ$('div[class]')要素のみを返すべきclassです。テストのシナリオ:jsfiddle.net/drzaus/m83mv
drzaus

1
@Kobi-私はあなたが何を手に入れているのかを私は見ていると思います。以下のようなエッジケースに.removeProp('class')または.className=undefinedフィルタ[class]まだ彼らはただだ、何かを返しますundefined。したがって、技術的にはクラスがまだあります(とは対照的.removeAttr('class')です。そのため、関数は機能しますが、バリアントは機能しません 。jsfiddle.net
drzaus / m83mv

1
簡単なテストを追加するとreturn c && c.replace(/\bcolor-\S+/g, '');
うまくいき

50

これを行うプラグインを作成しました。alterClass–ワイルドカードマッチングを使用して要素クラスを削除します オプションでクラスを追加:https : //gist.github.com/1517285

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

1
確かに非常に素晴らしい... Twitter Boostrapこのようなクラスを削除する必要があるコードを再利用するのに役立ちました:$(".search div").children('div').alterClass('span* row-fluid');
Leniel Maccaferri

15

これを、正規表現を引数として取るJqueryプラグインに一般化しました。

コーヒー:

$.fn.removeClassRegex = (regex) ->
  $(@).removeClass (index, classes) ->
    classes.split(/\s+/).filter (c) ->
      regex.test c
    .join ' '

JavaScript:

$.fn.removeClassRegex = function(regex) {
  return $(this).removeClass(function(index, classes) {
    return classes.split(/\s+/).filter(function(c) {
      return regex.test(c);
    }).join(' ');
  });
};

したがって、この場合、使用法は(CoffeeとJavascriptの両方)になります。

$('#hello').removeClassRegex(/^color-/)

Array.filterIE <9には存在しない関数を使用していることに注意してください。代わりにアンダースコアのフィルター関数を使用するか、このWTFPLのようなポリフィルにGoogleを使用できます。


11

他の場所で使用したい場合は、拡張機能をお勧めします。これは私にとってはうまくいきます。

 $.fn.removeClassStartingWith = function (filter) {
    $(this).removeClass(function (index, className) {
        return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
    });
    return this;
};

使用法:

$(".myClass").removeClassStartingWith('color');

4

ですべてのクラスを取得し、.attr("class")配列、そしてループとフィルターを取得できます。

var classArr = $("#sample").attr("class").split(" ")
$("#sample").attr("class", "")
for(var i = 0; i < classArr.length; i ++) {
    // some condition/filter
    if(classArr[i].substr(0, 5) != "color") {
        $("#sample").addClass(classArr[i]);
    }
}

デモ:http : //jsfiddle.net/L2A27/1/


追加var prefix='color';および変更...if (classArr[i].substr(0, prefix.length) != prefix)
リッチC

4

@ trembyのと同様の答えは、ここにコビさん@ある答え接頭辞や接尾辞のいずれかに一致するプラグインとして。

  • 例)ストリップbtn-minibtn-dangerではなく、btnときstripClass("btn-")
  • 例)ストリップhorsebtncowbtnではなく、btn-miniまたはbtnときstripClass('btn', 1)

コード:

$.fn.stripClass = function (partialMatch, endOrBegin) {
    /// <summary>
    /// The way removeClass should have been implemented -- accepts a partialMatch (like "btn-") to search on and remove
    /// </summary>
    /// <param name="partialMatch">the class partial to match against, like "btn-" to match "btn-danger btn-active" but not "btn"</param>
    /// <param name="endOrBegin">omit for beginning match; provide a 'truthy' value to only find classes ending with match</param>
    /// <returns type=""></returns>
    var x = new RegExp((!endOrBegin ? "\\b" : "\\S+") + partialMatch + "\\S*", 'g');

    // https://stackoverflow.com/a/2644364/1037948
    this.attr('class', function (i, c) {
        if (!c) return; // protect against no class
        return c.replace(x, '');
    });
    return this;
};

https://gist.github.com/zaus/6734731


1
記録のために、私はこれがより簡単であることに同意しません。
2014

@tremby申し訳ありませんが、毎回正規表現を記述する必要がないため、典型的な使用法(つまり、接頭辞と接尾辞)をよりシンプルにすることを意味しました
drzaus '30

3
私はまだ同意しません。あなたの方法では、ドキュメントを読み、正確に何がendOrBegin必要かを覚えておく必要があります。自明ではありません。正規表現を書くことの難しさは何ですか?/^match-at-start/そして/match-at-end$/すべてのJS開発者に知られています。しかし、それぞれ自分自身に。
2014

1
正規表現が悪用されることを懇願する以外の@tremby、非正規表現オプションはaddClass、すべてのjQuery開発者に知られている、、、removeClassおよびの既存のシグネチャとより密接に一致toggleClassします。ドキュメントを読むのは難しいですか?;)
drzaus

2
ドキュメントを読むのは難しいことではありませんが、@ trembyが言うように、彼のソリューションは自明ですが、あなたのソリューションはドキュメントを必要とします。自明のソリューションは、定義により使用する方が簡単です。
Francisco Hodge

2

jQueryプラグインの場合はこれを試してください

$.fn.removeClassLike = function(name) {
    return this.removeClass(function(index, css) {
        return (css.match(new RegExp('\\b(' + name + '\\S*)\\b', 'g')) || []).join(' ');
    });
};

またはこれ

$.fn.removeClassLike = function(name) {
    var classes = this.attr('class');
    if (classes) {
        classes = classes.replace(new RegExp('\\b' + name + '\\S*\\s?', 'g'), '').trim();
        classes ? this.attr('class', classes) : this.removeAttr('class');
    }
    return this;
};

2

ARS81回答(これで始まるクラス名のみに一致する)に基づいて、より柔軟なバージョンを示します。また、hasClass()正規表現バージョン。

使用法: $('.selector').removeClassRegex('\\S*-foo[0-9]+')

$.fn.removeClassRegex = function(name) {
  return this.removeClass(function(index, css) {
    return (css.match(new RegExp('\\b(' + name + ')\\b', 'g')) || []).join(' ');
  });
};

$.fn.hasClassRegex = function(name) {
  return this.attr('class').match(new RegExp('\\b(' + name + ')\\b', 'g')) !== null;
};

2

これprefixにより、ノードのclass属性から始まるすべてのクラス名が効果的に削除されます。他の回答は(これを書いている時点では)SVG要素をサポートしていませんが、このソリューションはサポートしています:

$.fn.removeClassPrefix = function(prefix){
    var c, regex = new RegExp("(^|\\s)" + prefix + "\\S+", 'g');
    return this.each(function(){
        c = this.getAttribute('class');
        this.setAttribute('class', c.replace(regex, ''));
    });
};

RegExp各コールバックからオブジェクトを1回作成する方が効率的ではないでしょうか?
エミールベルジェロン

1
@EmileBergeron-はい、そうなります!変更します
vsync

2

私は同じ問題を抱えており、アンダースコアの_.filterメソッドを使用する次のことを思いつきました。removeClassが関数を取り、クラス名のリストを提供することを発見したら、それを配列に変換し、クラス名を除外して、removeClassメソッドに戻るのは簡単でした。

// Wildcard removeClass on 'color-*'
$('[class^="color-"]').removeClass (function (index, classes) {
  var
    classesArray = classes.split(' '),
    removeClass = _.filter(classesArray, function(className){ return className.indexOf('color-') === 0; }).toString();

  return removeClass;
});

1
あなたは、アンダースコアが_.filterに何を説明することができます
バート

2

Element.classListを使用したバニラJavaScriptでもこれを行うことができます。正規表現を使用する必要もありません:

function removeColorClasses(element) { for (let className of Array.from(element.classList)) if (className.startsWith("color-")) element.classList.remove(className); }

注:開始前にArrayコピーを作成することに注意してください。これは、クラスが削除されると更新されるライブであるclassListため重要です。classListDomTokenList


1

className要素のDOMオブジェクトのプロパティを使用することもできます。

var $hello = $('#hello');
$('#hello').attr('class', $hello.get(0).className.replace(/\bcolor-\S+/g, ''));

1

で始まるクラスを削除するジェネリック関数begin

function removeClassStartingWith(node, begin) {
    node.removeClass (function (index, className) {
        return (className.match ( new RegExp("\\b"+begin+"\\S+", "g") ) || []).join(' ');
    });
}

http://jsfiddle.net/xa9xS/2900/

var begin = 'color-';

function removeClassStartingWith(node, begin) {
    node.removeClass (function (index, className) {
        return (className.match ( new RegExp("\\b"+begin+"\\S+", "g") ) || []).join(' ');
    });
}

removeClassStartingWith($('#hello'), 'color-');

console.log($("#hello")[0].className);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="hello" class="color-red color-brown foo bar"></div>


0

単語境界での正規表現分割\bは、これに対する最良の解決策ではありません。

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

または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 = classes.join(" ");
    });
    return this;
};

0

「example」というクラス名の要素が複数ある場合、「color-」のクラスをすべて削除するには、次のようにします。[jqueryを使用]

var objs = $('html').find('.example');
for(index=0 ; index < obj1s.length ; index++){
    objs[index].className = objs[index].className.replace(/col-[a-z1-9\-]*/,'');
}

正規表現に[a-z1-9-] *を入れない場合、名前に数字または「-」が含まれているクラスは削除されません。


0

最後に設定した色を削除するだけの場合は、次の方法が適しています。

私の状況では、クリックイベントのbodyタグにカラークラスを追加し、最後に設定されたカラーを削除する必要がありました。その場合は、現在の色を保存してから、データタグを調べて、最後に設定した色を削除します。

コード:

var colorID = 'Whatever your new color is';

var bodyTag = $('body');
var prevColor = bodyTag.data('currentColor'); // get current color
bodyTag.removeClass(prevColor);
bodyTag.addClass(colorID);
bodyTag.data('currentColor',colorID); // set the new color as current

あなたが必要としているものとは必ずしも正確ではないかもしれませんが、私にとってはそれであり、これは私が調べた最初のSOの質問でした。


ここでは関係ありません。SOでの推奨される動作なので、あなた自身の質問に答えることができます。
Emile Bergeron

@エミール:そうです。元の質問に直接答えることはできないので、私はそうするかもしれません。この回答をそのままにするか、削除する必要がありますか?
redfox05 2016

その時点では、それはあなた自身のリスクです、それはまだ反対投票も賛成投票もされていませんでした。したがって、リスクなしで自分の質問に移動できます。また、これについてすでに質問があるかどうかを確認して、重複を避けてください。
Emile Bergeron、2016

0

この問題に取り組む別の方法は、本来固有のデータ属性を使用することです。

次のように要素の色を設定します。 $el.attr('data-color', 'red');

そして、あなたはCSSでそれをスタイルするでしょう: [data-color="red"]{ color: tomato; }

これにより、クラスを使用する必要がなくなり、古いクラスを削除する必要があるという副作用があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.