Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Функция removeClass

У объекта есть свойство className, которое хранит список «классов» - слов, разделенных пробелами:

var obj = { 
  className: 'open menu'
}

Напишите функцию removeClass(obj, cls), которая удаляет класс cls, если он есть:

removeClass(obj, 'open'); // obj.className='menu'
removeClass(obj, 'blabla'); // без изменений (нет такого класса)

P.S. Дополнительное усложнение. Функция должна корректно обрабатывать дублирование класса в строке:

obj = { className: 'my menu menu' };
removeClass(obj, 'menu');
alert(obj.className); // 'my'

Лишних пробелов после функции образовываться не должно.

Решение
Решение

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

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. Без нее функция будет работать с ошибками.

#171
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!