31 lines
1.5 KiB
Markdown
31 lines
1.5 KiB
Markdown
Решение заключается в том, чтобы разбить `className` в массив классов, а затем пройтись по нему циклом. Если класс есть - удаляем его `splice`, заново объединяем массив в строку и присваиваем объекту.
|
||
|
||
```js
|
||
//+ 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`. Без нее функция будет работать с ошибками.
|