RatiboR1978
@RatiboR1978

Не могу понять почему не удаляются все open?

Код:
var obj = {
    className: 'open menu open open'
};
function removeClass(obj, cls){
    var classes = obj.className.split(' ');
    console.log(classes);
    for (var i = 0; i < classes.length; i++){
        var idx = classes.indexOf(cls);
        if (idx !== -1) {
            classes.splice(idx, 1);
            console.log(classes);
        }
    }

    obj.className = classes.join(' ');
}

removeClass(obj, 'open');
console.log(obj.className);


Надо чтобы функция удаляла все "open", если цикла нет то один "open" удаляется, поставил в цикл и удаляется только два, остальные нет, почему не пойму. Help?
  • Вопрос задан
  • 148 просмотров
Решения вопроса 3
@tusklozeleniy
Front-end разработчик
classes.length - не константа. Она меняется при изменении длины массива.
По шагам цикла:
Шаг 0:
i = 0;
classes.length = 4;
i < classes.length // true
удаляем 'open' из массива

Шаг 1:
i = 1;
classes.length = 3;
i < classes.length // true
удаляем 'open' из массива

Шаг 2:
i = 2;
classes.length = 2;
i < classes.length // false
Выходим из цикла
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
А вам действительно нужна поддержка динозавров? С IE8+ можно использовать стандартные средства для решения этой задачи и не тратить время на неработающие велосипеды.
Ответ написан
Комментировать
Lynn
@Lynn
nginx, js, css
А вообще это пишется в три строчки:
obj.className
  .split(/\s+/)
  .filter(val => val !== cls)
  .join(' ');
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
Еще проще:
function removeClass(obj, cls){
    obj.className = obj.className.split(cls).join('');
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы