回答:
jQueryでは、実際のDOM要素はインデックス0にあり、これは機能するはずです
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
単語境界での正規表現分割\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();
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(" "));
$e.attr('class', $.map($e.attr('class').split(' '), function (klass) { return klass.indexOf(prefix) != 0 ? klass : undefined; }).join(' '));
class="blackRow blackText orangeFace blackHead"
すると戻りclass=" orangeFace "
ますremoveClassPrefix("black");
。私はそのように結果をトリミングすることでこれを解決しました:el.className = $.trim(classes.join(" "));
。
ワイルドカードクラスの削除を行う単純なjQueryプラグイン-alterClassを作成しました。オプションでクラスも追加します。
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
これを処理するために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;
}
の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>]
http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html言う:
...そして.removeClass()はすべてのクラスを削除します...
わたしにはできる ;)
乾杯
単純な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");
私はまったく同じ問題の解決策を探していました。接頭辞「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_');
Prestaulの回答は役に立ちましたが、私にはうまくいきませんでした。IDでオブジェクトを選択するjQueryの方法は機能しませんでした。私は使用しなければなりませんでした
document.getElementById("a").className
の代わりに
$("#a").className
(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);
$("#element").removeAttr("class").addClass("yourClass");