Удалить все классы, которые начинаются с определенной строки - PullRequest
97 голосов
/ 12 сентября 2008

У меня есть div с id="a", к которому может быть прикреплено любое количество классов из нескольких групп. У каждой группы есть определенный префикс. В javascript я не знаю, какой класс из группы находится на div. Я хочу иметь возможность очистить все классы с заданным префиксом, а затем добавить новый. Если я хочу удалить все классы, начинающиеся с «bg», как мне это сделать? Примерно так, но на самом деле это работает:

$("#a").removeClass("bg*");

Ответы [ 15 ]

106 голосов
/ 31 мая 2012

Регулярное разбиение по границе слова \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();
57 голосов
/ 12 сентября 2008

В jQuery фактический элемент DOM имеет нулевой индекс, это должно работать

$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
29 голосов
/ 24 декабря 2011

Я написал простой плагин jQuery - alterClass , который выполняет удаление групповых символов. При желании добавим классы тоже.

$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) 
11 голосов
/ 12 сентября 2008

Вам не нужен какой-либо специфичный для 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;
}
9 голосов
/ 06 марта 2013

Использование 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>​]
5 голосов
/ 09 марта 2009

http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html говорит:

... и .removeClass () удалят все классы ...

у меня работает;)

ура

2 голосов
/ 12 марта 2015

Подход, который я бы использовал, используя простые конструкции 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]);
        }
    });
}

Теперь эта функция может быть вызвана из любого места, по нажатию кнопки или из кода:

removeclasses("a","bg");
2 голосов
/ 15 октября 2013

Я искал решение для точно такой же проблемы. Чтобы удалить все классы, начинающиеся с префикса "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_');
1 голос
/ 28 сентября 2012

Я знаю, что это старый вопрос, но я нашел новое решение и хочу знать, есть ли у него недостатки?

$('#a')[0].className = $('#a')[0].className
                              .replace(/(^|\s)bg.*?(\s|$)/g, ' ')
                              .replace(/\s\s+/g, ' ')
                              .replace(/(^\s|\s$)/g, '');
0 голосов
/ 26 октября 2018

Для современных браузеров:

let element = $('#a')[0];
let cls = 'bg';

element.classList.remove.apply(element.classList, Array.from(element.classList).filter(v=>v.startsWith(cls)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...