Выборка атрибутов по опрделенному классу и их сумма
Добрый день, имею вот такие 2 лока:
<div class="l-block-decoration l_roof block_2"> <div class="title-decoration">ОТДЕЛКА ПОТОЛКА</div> <div class="vars align-justify"> <div class="item-lining bg-none close" data-cat-id="7" data-name-cat="ceiling-decoration" data-element-id="0"> <img src="assets/template/images/close-btn.png" alt=""> <div>Нет</div> </div> <div class="item-lining bg-none" data-background-url="assets/template/image/filter/additional/ad84276b47d00f274e2fba811c27d1ed.png" data-name-cat="ceiling-decoration" data-element-id="4600"> <img src="assets/template/image/filter/additional/76b9eef4a289c8ff7dffc26b11d27796.png" alt=""> <div>Деревянная вагонка</div> </div> <div class="item-lining bg-none" data-background-url="assets/template/image/filter/additional/d87466caf81e0449f059d31668fc3a9c.png" data-name-cat="ceiling-decoration" name="getItems" data-element-id="3200"> <img src="assets/template/image/filter/additional/8218cd20120dbc83a7c94ce6ced69964.png" alt=""> <div>ПВХ вагонка</div> </div> </div> </div> <div class="l-block-decoration l_roof mt180 block_3"> <div class="title-decoration"> <div>ВНЕШНЯЯ ОБШИВКА</div> <div class="green-line3"></div> </div> <div class="vars align-justify"> <div class="item-lining bg-none close" data-cat-id="3" data-name-cat="maket-cladding" data-element-id="0"> <img src="assets/template/images/close-btn.png" alt=""> <div>Нет</div> </div> <div class="item-lining bg-none" data-background-url="assets/template/image/filter/additional/26bfc78cf27c9adf76c86cb85c945e21.png" data-name-cat="maket-cladding" data-element-id="4600"> <img src="assets/template/image/filter/additional/48566ff5b5da4aeb37d9cdf372b5dabc.png" alt=""> <div>Цветной металл</div> </div> <div class="item-lining bg-none" data-background-url="assets/template/image/filter/additional/5f1be4954213ea77f47cee5442ad002b.png" data-name-cat="maket-cladding" data-element-id="4000"> <img src="assets/template/image/filter/additional/bfa4bdf204818aa734a5b74ce969a9a2.png" alt=""> <div>ПВХ вагонка</div> </div> </div> </div> </div> у каждого из них есть атрибут data-element-id, и каждый блок с классом item-lining в родительском блоке с классом block_2 и block_3 при клике на него получает класс active. У меня задача чтобы при клике на блок получать его атриюут и складывать его со следующим. Вот как я выбираю блок с классом active $(document).on("click",".item-lining",function() { if ($('.block_2 .vars .bg-none').hasClass('active')) { var block_2 = Number($(this).attr('data-element-id')); } else { console.log("Шеф все пропало"); } var result = block_2; console.log(result); }); Понимаю что если написать условие для block_3 то также могу получить значение атрибута, но как правильно их скалдывать между собой? писать несколько условия? или нужен цикл? Помогите понять? |
Получить все item-lining.active, в цикле обойти их, получая data-element-id и складывая.
|
а получить с помощью each?
|
$(document).on("click",".item-lining",function() { - это зря, делегировать нужно ближайшему родителю присутствующему на странице. То есть, в данном случае общему родителю блоков "l-block-decoration". А в обработчике щелчка получать все элементы ".item-lining.active", далее each.
Но странно у вас - щелчок по элементу, выбрали его, а снять выбор? Или выбор/снятие выбора иначе производится, тогда зачем этот обработчик щелчка? |
А можно пример показать? я не очень пока понимаю каак выстроить логику
|
Цитата:
У вас же есть обработчик щелчок по самим элементам, а значит логично, что этот щелчок и должен выбирать/снимать выбор, то есть первый щелчок - выбрали, второй - сняли выбор, третий - выбрали, и т.д.. И тут же получаем коллекцию выбранных элементов и делаем расчет: $(здесь_селектор_ближайшего_общего_родителя_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)), и обходить их сразу одним циклом. |
Часовой пояс GMT +3, время: 23:08. |