Изменить цвет фона выбранного div при нажатии не работает?

Я пытаюсь заставить выбранный элемент формы изменить цвет фона при нажатии. При первоначальной загрузке страницы выбирается первый вариант. Я пытаюсь выяснить, что не так с кодом, который у меня есть, потому что он загружает ПРАВИЛЬНО при просмотре в нашем редакторе страниц (мы используем wordpress и elementor для создания наших страниц и запускаем это как собственный HTML-код), но не не загружается правильно на «живой» странице.

Я исследовал другие способы сделать это без особого успеха, и я особенно сбит с толку, учитывая, что страница работает, но только при просмотре в качестве администратора в редакторе страниц (elementor).

https://jsfiddle.net/ncLk85mb/

function toggleClass(el) {
    var kids = document.getElementById('menu1').children;
    for (var i = 0; i < kids.length; i++) {
        kids[i].className = "item";
    }
    el.className = "item highlight";
}

Выше приведен код, который я пытаюсь использовать для выделения. Я вставил все, что у нас есть, в jsfiddle по ссылке выше.

На самом деле, я не вижу никакой проблемы. Обходной путь: вы можете объявить toggleClass в заголовке <script>, чтобы убедиться, что он был объявлен первым.

Mukyuu 25.03.2019 04:19

@Mukyuu не уверен, что на самом деле это исправит, по крайней мере, я только что пытался сделать это, к сожалению, без особого успеха.

Moose 25.03.2019 05:10

Попробуйте скопировать свой код в фрагмент кода SO, не забудьте импортировать jquery, и вы не обнаружите проблем с вашим текущим кодом ранее.

Mukyuu 25.03.2019 05:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
106
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте setAttribute:

function toggleClass(el) {
    var kids = document.getElementById('menu1').children;
    for (var i = 0; i < kids.length; i++) {
        kids[i].setAttribute("class", "item");
    }
    el.setAttribute("class", "item highlight");
}

Я пошел дальше и просто попытался заменить опцию setAttribute, поскольку она была у вас там, но, похоже, это не сработало? jsfiddle.net/9ktwbsyd

Moose 25.03.2019 05:09
Ответ принят как подходящий

Вам не нужно добавлять другую функцию, чтобы добавить или удалить класс highlight. Вы уже запускаете событие click для своего элемента div, поэтому вам нужно просто изменить его, как показано ниже:

$(".item").on('click', function() {
  $('.item').removeClass('highlight');
  $(this).addClass('highlight');
  var item = $(this).find('input');
  item.trigger("click");
  if (item.prop("checked")) {
    item.prop('checked', true);
  } else {
    item.prop('checked', false);
  }

});

$("input:checkbox").on('click', function() {
  var $box = $(this);
  if ($box.is(":checked")) {
    var group = "input:checkbox[name='" + $box.attr("name") + "']";
    $(group).prop("checked", false);
    $box.prop("checked", true);
  } else {
    $box.prop("checked", false);
  }
});

$("input[name=submit]").on('click', function() {
  var redirect = $('input[name = "product"]:checked').val();
  window.location.href = redirect;
});
/*Funnel Template - Step 2 - Order Form */

.main-panel {
  background-color: #fff;
  border: 1px solid #e0e0e0;
  border-radius: 5px;
  padding: 20px;
  margin-top: 20px;
  min-height: 320px;
  width: 100%;
}

.main-panel h2 {
  font-size: 26px;
  text-align: left;
  margin: 0;
  font-weight: bold;
}

.main-panel .item {
  margin: 15.4px 0;
  padding: 8px 0;
  min-height: 60px;
  display: flex;
  align-items: center;
  position: relative;
  cursor: pointer;
}

.main-panel .item p {
  margin: 0;
}

.main-panel .selection {
  float: left;
  width: 10%;
}

.main-panel .left-section {
  float: left;
  width: 46%;
}

.main-panel .right-section {
  float: right;
  width: 37%;
  margin-left: 5%;
  text-align: right;
}

.main-panel .item.highlight {
  background-color: #ffc500;
  z-index: 0;
  border-radius: 5px;
}

.main-panel .item input[type='checkbox'] {
  opacity: 0;
  z-index: 2;
  width: 18px;
  height: 18px;
  margin: 0;
}

.main-panel .item span::after {
  opacity: 1;
  z-index: 1;
  content: "";
  display: inline-block;
  position: absolute;
  width: 18px;
  height: 18px;
  left: 10px;
  border: 2px solid #172969;
  border-radius: 50%;
  background-color: #fff;
  -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
  -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
  transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
  line-height: 1.1em;
}

input[type = "checkbox"]:checked+span:after {
  font-family: 'FontAwesome';
  content: "\f00c";
  background-color: #172969;
  color: #fff;
}

input[type=button] {
  font-size: 18px;
  font-weight: 600;
  font-family: Noto Sans, sans-serif;
  background-color: #4CAF50;
  border: none;
  color: white;
  padding: 16px 32px;
  text-decoration: none;
  margin: 4px 2px;
  cursor: pointer;
  text-transform: uppercase;
  width: 100%;
  border-radius: 5px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "main-panel">
  <form>
    <h2 style = "text-align:center;">CHOOSE YOUR PACKAGE!</h2>
    <div id = "menu1">
      <div class = "item highlight">
        <div class = "selection"><input type = "checkbox" class = "styled" name = "product" value = "#link1" checked = "checked" /><span></span> </div>
        <div class = "left-section">
          Option 1 A
        </div>
        <div class = "right-section">
          Option 1 B
        </div>
      </div>
      <div class = "item">
        <div class = "selection"> <input type = "checkbox" name = "product" value = "link#2" /><span></span> </div>
        <div class = "left-section">
          Option 1 A
        </div>
        <div class = "right-section">
          Option 1 B
        </div>
      </div>
      <div class = "item">
        <div class = "selection"> <input type = "checkbox" name = "product" value = "#link3" /><span></span> </div>
        <div class = "left-section">
          Option 1 A
        </div>
        <div class = "right-section">
          Option 1 B
        </div>
      </div>
      <div class = "item">
        <div class = "selection"> <input type = "checkbox" name = "product" value = "#link4" /><span></span> </div>
        <div class = "left-section">
          Option 1 A
        </div>
        <div class = "right-section">
          Option 1 B
        </div>
      </div>
    </div>
    <input type = "button" name = "submit" value = "Click Now!" />
  </form>
</div>

JSFiddle Ссылка

Вместо этого используйте element.classList.add().

function toggleClass(el) {
    var kids = document.getElementById('menu1').children;
    for (var i = 0; i < kids.length; i++) {
        kids[i].classList.add("item");
    }
    el.classList.add("item");
    el.classList.add("highlight");
}

Другие вопросы по теме