Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавление фона блоку при отмеченном чекбокс (https://javascript.ru/forum/misc/79628-dobavlenie-fona-bloku-pri-otmechennom-chekboks.html)

_marisha 02.03.2020 12:26

Добавление фона блоку при отмеченном чекбокс
 
Доброго времени суток!
Необходимо при отмеченном чекбоксе произвести смену фона у div.
На данный момент удалось сделать смену только у label и только если кликнуть строго на сам чекбокс.
Если кликнуть на span, то фон не меняется.
Подскажите, пожалуйста, как у div сделать фон при отмеченном чекбокс и при клике на span и input? Спасибо.
<div class="col-lg-3 put_off">
  <label id="bx_117848907_1354_compare_link" class="checkbox-checked">
    <input type="checkbox" data-entity="compare-checkbox">
    <span data-entity="compare-title">Сравнить</span>
  </label>
</div>

$(window).load(function() {
  $('input[type="checkbox"]').each(function() {
    if ($(this).prop('checked')) {
      $(this).parent().addClass('checkbox-checked');
    }
  });
  $('input[type="checkbox"]').bind("change", function() {
    if ($(this).is(":checked")) {
      $(this).parent('label').addClass('checkbox-checked');
    } else {
      $(this).parent('label').removeClass('checkbox-checked');
    }
  });
})

.checkbox-checked {
  background: #FFCC00;
}

рони 02.03.2020 12:37

_marisha,
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .checkbox-checked {
  background: #FFCC00;
  }
.put_off label{
      display: block;
      height: 100%;
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$('.put_off').on('change', 'input[type="checkbox"]', function(event) {
$(event.delegateTarget).toggleClass('checkbox-checked', this.checked)
}).find('input[type="checkbox"]').trigger('change');
});
  </script>
</head>
<body>
<div class="col-lg-3 put_off">
  <label id="bx_117848907_1354_compare_link">
    <input type="checkbox" data-entity="compare-checkbox">
    <span data-entity="compare-title">Сравнить</span>
  </label>
</div>
<div class="col-lg-3 put_off">
  <label id="bx_117848907_1354_compare_link">
    <input  type="checkbox" data-entity="compare-checkbox" checked="checked">
    <span data-entity="compare-title">Сравнить</span>
  </label>
</div>

</body>
</html>

_marisha 02.03.2020 12:47

рони, спасибо что откликнулись )
Отлично, фон меняется ) Но только меняется если именно кликнуть на чекбокс.
А как сделать чтобы и при клике на сам span фон менялся?
Можно ещё сделать так, но по id:
$(window).load(function() {
  $('input[type="checkbox"]').each(function() {
    if ($(this).prop('checked')) {
      document.getElementById('checkbox').style.backgroundColor = "#FCAC7D";
    }
  });

  $('input[type="checkbox"]').bind("change", function() {
    if ($(this).is(":checked")) {
      document.getElementById('checkbox').style.backgroundColor = "#FCAC7D";
    } else {
      $(this).parent('label').removeClass('checkbox-checked');
      document.getElementById('checkbox').style.backgroundColor = "#fff";
    }
  });
})

Но Ваш пример лучше :)

рони 02.03.2020 12:57

Цитата:

Сообщение от _marisha
Но только меняется если именно кликнуть на чекбокс.
А как сделать чтобы и при клике на сам span фон менялся?

в каком браузере у вас не работает код из поста #2 ?

_marisha 02.03.2020 13:01

Цитата:

Сообщение от рони (Сообщение 520838)
в каком браузере у вас не работает код из поста #2 ?

- в Chrome/Mozilla Ваш пример работает только для чекбокса, но не span.

voraa 02.03.2020 13:03

Быть такого не может

рони 02.03.2020 13:06

_marisha,
:-?

рони 02.03.2020 13:07

_marisha,
возможно у вас другая структура, а не та которую вы показали.

_marisha 02.03.2020 13:16

рони, видео
Цитата:

Сообщение от рони (Сообщение 520842)
_marisha,
возможно у вас другая структура, а не та которую вы показали.

- :(

laimas 02.03.2020 14:06

рони, видимо "фон" подразумевает все и за текстом, и label, span должны иметь стиль block.

_marisha 03.03.2020 13:19

laimas, верно, "фон" подразумевается у всего div-a

рони 03.03.2020 13:47

_marisha,
Цитата:

Сообщение от laimas
, и label, span должны иметь стиль block.

.put_off label{
      display: block;
      height: 100%;
  }

_marisha 12.03.2020 11:03

В общем был скрипт, который менял логику работы чекбокса:
compare: function(event)
{
var checkbox = this.obCompare.querySelector('[data-entity="compare-checkbox"]'),//input
target = BX.getEventTarget(event);//span
checked = true;
if (checkbox) {
var checked = target === checkbox ? checkbox.checked : !checkbox.checked;
/*Добавлена проверка*/
if (checked == true)
{
document.getElementById('button_on_checkbox').innerHTML = 'В сравнении';
document.getElementById('compare-active').classList.add('compare-active');
}
else
{
document.getElementById('button_on_checkbox').innerHTML = 'Сравнить';
document.getElementById('compare-active').classList.remove('compare-active');
}
/*Добавлена проверка*/
}
var url = checked ? this.compareData.compareUrl : this.compareData.compareDeleteUrl, compareLink;
if (url)
{
if (target !== checkbox)
{
BX.PreventDefault(event);
this.setCompared(checked);
}
switch (this.productType)
{
case 0: // no catalog
case 1: // product
case 2: // set
compareLink = url.replace('#ID#', this.product.id.toString());
break;
case 3: // sku
compareLink = url.replace('#ID#', this.offers[this.offerNum].ID);
break;
}
BX.ajax({
method: 'POST',
dataType: checked ? 'json' : 'html',
url: compareLink + (compareLink.indexOf('?') !== -1 ? '&' : '?') + 'ajax_action=Y',
onsuccess: checked
? BX.proxy(this.compareResult, this)
: BX.proxy(this.compareDeleteResult, this)
});
}
},


Добавлена проверка на чекбокс.
Сейчас вроде функционирует как нужно, т.е. если чекбокс отмечен, то применяется фон и меняется надпись.

Возник вопрос в другом, каким образом сделать так, чтобы после перезагрузки страницы все стили сохранялись?
На данный момент после перезагрузки страницы только чекбокс отмечен, а стилей нет

_marisha 12.03.2020 12:18

Есть localStorage
Делаю так:
if (checked == true)
{
var comparedText = document.getElementById('button_on_checkbox').innerHTML = 'В сравнении';
localStorage.setItem('comparedText', comparedText); 
if(localStorage.getItem('compareText') == 'В сравнении')
{                       document.getElementById('button_on_checkbox').innerHTML = 'В сравнении';
}
document.getElementById(`compare-active`).classList.add(`compare-active`);
}

В консоли у localStorage есть compareText, но при обновлении страницы надпись 'В сравнении' не сохраняется :-?

_marisha 13.03.2020 11:35

Удалось сохранить стили после обновления страницы:
if (localStorage['checked'] == 'true' )
{
var comparedText = document.getElementById('button_on_checkbox').innerHTML = 'В сравнении';
document.getElementById(`compare-active`).classList.add(`compare-active`);
}


Теперь возникла другая неприятность.
Если у одного товара чекбокс отмечен, тогда у всех товаров кнопка выделена будто товар отмечен чекбоксом :(


Часовой пояс GMT +3, время: 05:24.