字边界上的正则表达式分裂\b
不是最佳解决方案:
var prefix = "prefix"; var classes = el.className.split(" ").filter(function(c) { return c.lastIndexOf(prefix, 0) !== 0; }); el.className = classes.join(" ").trim();
或者作为jQuery mixin:
$.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();
使用jQuery,实际的DOM元素在索引为零,这应该工作
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
我写了一个简单的jQuery插件 - alterClass,它可以删除通配符类.也可以选择添加类.
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
您不需要任何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; }
使用第二个签名的$.fn.removeClass
:
// Considering: var $el = $(''); function makeRemoveClassHandler(regex) { return function (index, classes) { return classes.split(/\s+/).filter(function (el) {return regex.test(el);}).join(' '); } } $el.removeClass(makeRemoveClassHandler(/^foo-/)); //> [??]