en.javascript.info/1-js/4-data-structures/7-array-methods/3-remove-class/solution.md
Ilya Kantor 87bf53d076 update
2014-11-16 01:40:20 +03:00

1.5 KiB
Raw Blame History

Решение заключается в том, чтобы разбить className в массив классов, а затем пройтись по нему циклом. Если класс есть - удаляем его splice, заново объединяем массив в строку и присваиваем объекту.

//+ run
function removeClass(obj, cls) {
  var classes = obj.className.split(' ');
 
  for(i=0; i<classes.length; i++) {
    if (classes[i] == cls) {
      classes.splice(i, 1); // удалить класс  
*!*
      i--; // (*)
*/!*
    }
  }
  obj.className = classes.join(' ');
	
}

var obj = { className: 'open menu menu' }

removeClass(obj, 'blabla'); 
removeClass(obj, 'menu')
alert(obj.className)   // open

В примере выше есть тонкий момент. Элементы массива проверяются один за другим. При вызове splice удаляется текущий, i-й элемент, и те элементы, которые идут дальше, сдвигаются на его место.

Таким образом, на месте i оказывается новый, непроверенный элемент.

Чтобы это учесть, строчка (*) уменьшает i, чтобы следующая итерация цикла заново проверила элемент с номером i. Без нее функция будет работать с ошибками.