Удалите все классы, которые начинаются с определенной строки
у меня есть div с id="a"
который может иметь любое количество классов, присоединенных к нему, из нескольких групп. Каждая группа имеет определенный префикс. В javascript я не знаю, какой класс из группы находится в div. Я хочу иметь возможность очистить все классы с заданным префиксом, а затем добавить новый. Если я хочу удалить все классы, которые начинаются с "bg", как мне это сделать? Что-то вроде этого, но это действительно работает:
$("#a").removeClass("bg*");
14 ответов:
С помощью jQuery фактический элемент DOM находится в нулевом индексе, это должно работать
$('#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 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; };
Я написал простой плагин jQuery-alterClass, что делает удаление класса подстановочных знаков. Будет дополнительно добавлять классы тоже.
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
вам не нужен какой-либо конкретный код jQuery для обработки этого. Просто используйте регулярное выражение, чтобы заменить их:
$("#a").className = $("#a").className.replace(/\bbg.*?\b/g, '');
вы можете изменить это для поддержки любого префикса, но более быстрый метод выше, поскольку регулярное выражение будет скомпилировано только один раз:
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 () удалит все классы...
Это работает для меня ;)
ура
Я искал решение точно такой же проблемы. Чтобы удалить все классы, начиная с префикса "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_');
подход, который я бы использовал с использованием простых конструкций jQuery и функций обработки массива, заключается в объявлении функции, которая принимает идентификатор элемента управления и префикс класса и удаляет все классы. Код:
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");
Я знаю, что это старый вопрос, но я нашел новое решение и хочу знать, есть ли у него недостатки?
$('#a')[0].className = $('#a')[0].className .replace(/(^|\s)bg.*?(\s|$)/g, ' ') .replace(/\s\s+/g, ' ') .replace(/(^\s|\s$)/g, '');
Я также использовать дефис " - " и цифры для имени класса. Поэтому моя версия включает ' \d -'
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.\d-*?\b/g, '');
(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);