Подтвердить что ты не робот

Как добавлять и удалять классы в Javascript без jQuery

Я ищу быстрый и безопасный способ добавления и удаления классов из элемента html без jQuery.
Он также должен работать в раннем IE (IE8 и выше).

4b9b3361

Ответ 1

В браузерах, которые не поддерживают classList, работают 3 функции:

function hasClass(el, className)
{
    if (el.classList)
        return el.classList.contains(className);
    return !!el.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
}

function addClass(el, className)
{
    if (el.classList)
        el.classList.add(className)
    else if (!hasClass(el, className))
        el.className += " " + className;
}

function removeClass(el, className)
{
    if (el.classList)
        el.classList.remove(className)
    else if (hasClass(el, className))
    {
        var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
        el.className = el.className.replace(reg, ' ');
    }
}

https://jaketrent.com/post/addremove-classes-raw-javascript/

Ответ 2

Другой подход для добавления класса к элементу с использованием чистого JavaScript

Для добавления класса:

document.getElementById("div1").classList.add("classToBeAdded");

Для удаления класса:

document.getElementById("div1").classList.remove("classToBeRemoved");

Примечание:, но не поддерживается в IE <= 9 или Safari <= 5.0

Ответ 3

Для будущей дружелюбия, я второй рекомендации для classList с polyfill/shim: https://developer.mozilla.org/en-US/docs/Web/API/Element/classList#wrapper

var elem = document.getElementById( 'some-id' );
elem.classList.add('some-class'); // Add class
elem.classList.remove('some-other-class'); // Remove class
elem.classList.toggle('some-other-class'); // Add or remove class
if ( elem.classList.contains('some-third-class') ) { // Check for class
    console.log('yep!');
}

Ответ 4

Чтобы добавить класс без JQuery, просто добавьте yourClassName к элементу className

document.documentElement.className += " yourClassName";

Чтобы удалить класс, вы можете использовать replace() функцию

document.documentElement.className.replace(/(?:^|\s)yourClassName(?!\S)/,'');

Также как @DavidThomas упомянул, что вам нужно использовать конструктор new RegExp(), если вы хотите динамически передавать имена классов в функцию replace.

Ответ 5

Добавить и удалить классы (проверены на IE8 +)

Добавьте trim() в IE (взято из .trim() в JavaScript, не работающем в IE)

if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}

Добавление и удаление классов:

function addClass(element,className) {
  var currentClassName = element.getAttribute("class");
  if (typeof currentClassName!== "undefined" && currentClassName) {
    element.setAttribute("class",currentClassName + " "+ className);
  }
  else {
    element.setAttribute("class",className); 
  }
}
function removeClass(element,className) {
  var currentClassName = element.getAttribute("class");
  if (typeof currentClassName!== "undefined" && currentClassName) {

    var class2RemoveIndex = currentClassName.indexOf(className);
    if (class2RemoveIndex != -1) {
        var class2Remove = currentClassName.substr(class2RemoveIndex, className.length);
        var updatedClassName = currentClassName.replace(class2Remove,"").trim();
        element.setAttribute("class",updatedClassName);
    }
  }
  else {
    element.removeAttribute("class");   
  } 
}

Использование:

var targetElement = document.getElementById("myElement");

addClass(targetElement,"someClass");

removeClass(targetElement,"someClass");

Рабочий JSFIDDLE: http://jsfiddle.net/fixit/bac2vuzh/1/

Ответ 6

classList доступен из IE10 и далее, используйте это, если можете.

element.classList.add("something");
element.classList.remove("some-class");

Ответ 7

Я использую этот простой код для этой задачи:

CSS код

.demo {
     background: tomato;
     color: white;
}

Javascript код

function myFunction() {
    /* Assign element to x variable by id  */
    var x = document.getElementById('para);

    if (x.hasAttribute('class') {      
        x.removeAttribute('class');     
    } else {
        x.setAttribute('class', 'demo');
    }
}

Ответ 8

Когда вы удаляете RegExp из уравнения, вы оставляете менее "дружественный" код, но его все же можно выполнить с помощью (намного) менее элегантного способа split().

function removeClass(classString, toRemove) {
    classes = classString.split(' ');
    var out = Array();
    for (var i=0; i<classes.length; i++) {
        if (classes[i].length == 0) // double spaces can create empty elements
            continue;
        if (classes[i] == toRemove) // don't include this one
            continue;
        out.push(classes[i])
    }
    return out.join(' ');
}

Этот метод намного больше, чем простой replace(), но по крайней мере его можно использовать в старых браузерах. И в случае, если браузер не поддерживает команду split(), относительно легко добавить ее с помощью прототипа.

Ответ 9

Удалить класс с помощью JavaScript

const removeClass = ($el, className) => {
  const _removeClass = function(el) {
    if (el.classList) {
      el.classList.remove(className);
    } else {
      el.className = el.className.replace(
        new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'),
        ' ',
      );
    }
  };
  if ($el.length === 1) {
    _removeClass($el);
  } else if ($el.length > 1) {
    $el.forEach(function(item) {
      _removeClass(item);
    });
  }
};