たとえば、一致するすべてのクラスを削除する簡単な方法はありますか?
color-*
だから私が要素を持っているなら:
<div id="hello" class="color-red color-brown foo bar"></div>
取り外した後、
<div id="hello" class="foo bar"></div>
ありがとう!
たとえば、一致するすべてのクラスを削除する簡単な方法はありますか?
color-*
だから私が要素を持っているなら:
<div id="hello" class="color-red color-brown foo bar"></div>
取り外した後、
<div id="hello" class="foo bar"></div>
ありがとう!
回答:
removeClassの機能があるため、関数の引数を取るjQueryの1.4。
$("#hello").removeClass (function (index, className) {
return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});
ライブの例:http : //jsfiddle.net/xa9xS/1409/
classes = ( value || "" ).match( rnotwhite ) || [];
sport-
、nav-
そしてcolor-
?
*-color
ですか?
(color-|sport-|nav-)
。それはcolor-
、またはsport-
、またはに一致しnav-
ます。したがって、上記の答えはになり/(^|\s)(color-|sport-|nav-)\S+/g
ます。
$('div').attr('class', function(i, c){
return c.replace(/(^|\s)color-\S+/g, '');
});
$('div[class]')
要素のみを返すべきclass
です。テストのシナリオ:jsfiddle.net/drzaus/m83mv
.removeProp('class')
または.className=undefined
フィルタ[class]
まだ彼らはただだ、何かを返しますundefined
。したがって、技術的にはクラスがまだあります(とは対照的.removeAttr('class')
です。そのため、関数は機能しますが、バリアントは機能しません 。jsfiddle.net
return c && c.replace(/\bcolor-\S+/g, '');
これを行うプラグインを作成しました。alterClass–ワイルドカードマッチングを使用して要素クラスを削除します オプションでクラスを追加:https : //gist.github.com/1517285
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
Twitter Boostrap
このようなクラスを削除する必要があるコードを再利用するのに役立ちました:$(".search div").children('div').alterClass('span* row-fluid');
これを、正規表現を引数として取る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.filter
IE <9には存在しない関数を使用していることに注意してください。代わりにアンダースコアのフィルター関数を使用するか、このWTFPLのようなポリフィルにGoogleを使用できます。
他の場所で使用したい場合は、拡張機能をお勧めします。これは私にとってはうまくいきます。
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
使用法:
$(".myClass").removeClassStartingWith('color');
ですべてのクラスを取得し、.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]);
}
}
var prefix='color';
および変更...if (classArr[i].substr(0, prefix.length) != prefix)
@ trembyのと同様の答えは、ここにコビさん@ある答え接頭辞や接尾辞のいずれかに一致するプラグインとして。
btn-mini
とbtn-danger
ではなく、btn
ときstripClass("btn-")
。horsebtn
とcowbtn
ではなく、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;
};
endOrBegin
必要かを覚えておく必要があります。自明ではありません。正規表現を書くことの難しさは何ですか?/^match-at-start/
そして/match-at-end$/
すべてのJS開発者に知られています。しかし、それぞれ自分自身に。
addClass
、すべてのjQuery開発者に知られている、、、removeClass
およびの既存のシグネチャとより密接に一致toggleClass
します。ドキュメントを読むのは難しいですか?;)
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;
};
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;
};
これ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回作成する方が効率的ではないでしょうか?
私は同じ問題を抱えており、アンダースコアの_.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;
});
Element.classListを使用したバニラJavaScriptでもこれを行うことができます。正規表現を使用する必要もありません:
function removeColorClasses(element)
{
for (let className of Array.from(element.classList))
if (className.startsWith("color-"))
element.classList.remove(className);
}
注:開始前にArray
コピーを作成することに注意してください。これは、クラスが削除されると更新されるライブであるclassList
ため重要です。classList
DomTokenList
className
要素のDOMオブジェクトのプロパティを使用することもできます。
var $hello = $('#hello');
$('#hello').attr('class', $hello.get(0).className.replace(/\bcolor-\S+/g, ''));
で始まるクラスを削除するジェネリック関数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>
単語境界での正規表現分割\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;
};
「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-] *を入れない場合、名前に数字または「-」が含まれているクラスは削除されません。
最後に設定した色を削除するだけの場合は、次の方法が適しています。
私の状況では、クリックイベントの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の質問でした。
この問題に取り組む別の方法は、本来固有のデータ属性を使用することです。
次のように要素の色を設定します。 $el.attr('data-color', 'red');
そして、あなたはCSSでそれをスタイルするでしょう: [data-color="red"]{ color: tomato; }
これにより、クラスを使用する必要がなくなり、古いクラスを削除する必要があるという副作用があります。