2013-09-30 2 views
1

(Чистый JavaScript только, пожалуйста!)Как удалить один класс только в Javascript с помощью Regex?

Я хочу, чтобы создать вспомогательную функцию, которая удаляет один class из div с несколькими классами. Я себе функцию следующим образом:

function remove_class(div, klass) { 
    div.className = div.className.replace(/(?:^|\s)active(?!\S)/ , ''); 
} 

Класс удален здесь active. Однако как удалить любое имя класса, т.е. один прошел как переменная klass?

+0

Почему не использовать ['classList'] (https://developer.mozilla.org/en-US/docs/Web/API/element.classList)? На странице MDN даже есть [прокладка] (https://developer.mozilla.org/en-US/docs/Web/API/element.classList#wrapper) для совместимости с браузером. – Phil

+0

Ограниченная совместимость - вот почему. :) И это не дубликат - это гораздо более конкретный вопрос. – knutole

+1

Совместим с IE8 с прокладкой. И да, этот вопрос является ** точным ** дубликатом другого. Ответы тоже такие – Phil

ответ

4

Использовать RegExp constructor вместо литерала RegExp. Конструктор берет строку в качестве своего первого параметра, поэтому вы можете ее построить так, как вам нравится.

function remove_class(div, klass) { 
    div.className = div.className.replace(new RegExp('(?:^|\\s)' + klass + '(?!\\S)'), ''); 
} 

Обратите внимание, что при использовании конструктора не требуются разделители (передние и задние косые черты).

+0

Я никогда не использовал конструктор RegExp. У вас есть рабочий пример? – knutole

+0

Извините, все идет. – JAAulde

+0

yup, это работает! благодаря! – knutole

1

Вместо использования/регулярное выражение/синтаксис можно использовать RegExp: что-то вроде этого:

function remove_class(div, klass) { 
    var regex = new RegExp('\/(?:^|\\s)' + klass + '(?!\\S)\/'); 
    div.className = div.className.replace(regex , ''); 
} 
+1

Обратите внимание, что разделители RegExp (ведущий и конечный косой чертой) нужны только для литерала RegExp. – JAAulde

1

Вы можете создать регулярное выражение так:

var re = new RegExp("regex","g"); 

ЗАКАНЧИВАТЬ https://stackoverflow.com/a/494046/1778812

+0

Если этот вопрос был дубликатом, вы должны были отметить его как таковой – Phil

+0

@Phil rep недостаточно высоко, чтобы проголосовать за закрытие. (Копирование ответов между вопросами по-прежнему глупо.) – Mathletics

+0

Есть ли один ответ в так называемом дубликате с синтаксисом принятого ответа на этот вопрос? 'new RegExp ('(?:^| \\ s)' + klass + '(?! \\ S)'), ''' Нет. – knutole

Смежные вопросы