Показать сообщение отдельно
  #6 (permalink)  
Старый 01.12.2020, 19:12
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от nik.chernov85
я не очень пока понимаю каак выстроить логику
Ну если этот код все что имеется, то тут как раз никакой логики и нет. А что это, для чего тоже не понятно. Но если, к примеру, такой вариант: есть элемент выбором и снятием выбора которого управляют две независимые кнопки, то в обработчиках этих кнопок должен быть вызов функции, которая и будет в цикле обрабатывать элементы "item-lining.active", то есть, сразу после выбора/снятия выбора.

У вас же есть обработчик щелчок по самим элементам, а значит логично, что этот щелчок и должен выбирать/снимать выбор, то есть первый щелчок - выбрали, второй - сняли выбор, третий - выбрали, и т.д.. И тут же получаем коллекцию выбранных элементов и делаем расчет:

$(здесь_селектор_ближайшего_общего_родителя_l_roof).on("click", ".item-lining", function() {
    
    var o = $(this), v = 0;
    
    //лучше не каждому элементу соседу класс указывать,
    //а родителю vars, так как через css можно обратиться к дочерним
    //если это нужно  
    //выбираем/снимаем выбор с элементов блока vars
    o.parent().toggleClass('active');
    
    if(o.parent().hasClass('active')) {
        //получаем соседние элементы, обходим циклом
        o.siblings().each(function() {
            //получаем нужный атрибут, складываем
            v += +this.dataset.elementId
        });        
        v += +o.data('element-id')
    }
  
    console.log(v)
    //Если нужно у все выбранных посчитать, то есть родительских выбранных блоков, 
    //то получить все vars.active, обходом их в цикле, получать дочерние элементы элементы ">div"
    //и уже обходом их в цикле получать у них значение атрибута и складывать 
});


Если же отмечать не родителя, а как прежде элемент и соседние элементы, то так:

o.add(o.siblings()).toggleClass('active');


вместо o.parent().toggleClass('active');, и получать все элементы ".item-lining.active" у общего родителя, а в обработчике это будет event.delegateTarget (в функции добавить аргумент function(event)), и обходить их сразу одним циклом.

Последний раз редактировалось laimas, 01.12.2020 в 19:46.
Ответить с цитированием