удаление и добавление классов к модальным элементам контента - PullRequest
0 голосов
/ 22 мая 2018

У меня 2 modal элементов.В обоих у меня есть этот маленький элемент стилевого оформления : https://jsfiddle.net/EricTalv/wjmfe799/10/ Имея только один из них на одной странице , он работает отлично .

Проблема возникает, когда я пытаюсь добавить их к своим модалам: https://jsfiddle.net/EricTalv/x5qwnv82/1/

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

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

Я пытался эту скрипку: http://jsfiddle.net/chipChocolate/pb95kv32/ эта концепция могла быработать, но не может заставить его работать, но также затрудняет чтение, так что было бы лучше более эффективное решение.

HTML:

<!-- The Modal 1-->
<div class="modal" id="modal1">
  <div class="modal-dialog">
    <div class="modal-content">

      <!-- Modal Header -->
      <div class="modal-header">
        <h4 class="modal-title">Modal Heading 11111</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>

      <div id="list-area">
        <ul id="list-items-container">
          <li class="item">item1</li>
          <li class="item">item2</li>
        </ul>
      </div>

      <!-- Modal footer -->
      <div class="modal-footer">
        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
      </div>

    </div>
  </div>
</div>

<!-- The Modal 2-->
<div class="modal" id="modal2">
  <div class="modal-dialog">
    <div class="modal-content">

      <!-- Modal Header -->
      <div class="modal-header">
        <h4 class="modal-title">Modal Heading 22222</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>

      <div id="list-area">
        <ul id="list-items-container">
          <li class="item active">other1</li>
          <li class="item">other2</li>
        </ul>
      </div>

      <!-- Modal footer -->
      <div class="modal-footer">
        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
      </div>

    </div>
  </div>
</div>

JS:

var header = document.getElementById("list-items-container");
var btns = header.getElementsByClassName("item");

for (var i = 0; i < btns.length; i++) {
  btns[i].addEventListener("click", function() {
    var current = document.getElementsByClassName("active");
    current[0].className = current[0].className.replace(" active", "");
    this.className += " active";
  });
}

CSS:

body {
  padding: 10px;
}

/* the list area  */

#list-area {
  background-color: #FC600A;
  border: 2px solid #000;
  display: inline-flex;
  width: 50%;
}

#list-items-container {
  padding: 0;
  width: 100%;
}

#list-items-container li {
  list-style: none;
  font-size: 35px;
  font-family: Corbel;
  color: #1489B8;
  padding: 0 10px 0 10px;
  width: 100%;
  transition: all .5s ease;
}

#list-items-container li:nth-child(odd) {
  background-color: #F7E0D4;
}

#list-items-container li:hover,
#list-items-container .active {
  color: red;
  cursor: pointer;
  padding-left: 50px;
}

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вы можете поменять свой JavaScript на этот изящный маленький кусочек jQuery.Здесь он будет переключать класс active на любой элемент li, по которому щелкнули, и удалит его из его братьев и сестер:

$('li').click(function() {
    $(this).siblings('li').removeClass('active');
    $(this).addClass('active');
});
0 голосов
/ 22 мая 2018
  1. Вы не можете иметь дублирующиеся идентификаторы.Итак, я изменил #list-area на .list-area и #list-items-container на .list-items-container в html и css-коде.
  2. JS:

    //Get all buttons
    var btns = document.getElementsByClassName("item");
    
    for (var i = 0; i < btns.length; i++) {
      btns[i].addEventListener("click", function() {
    
          //for clicked item getting parentNode and all its child
          var siblings = this.parentNode.childNodes
    
          //check if children have class "active" and remove it
          siblings.forEach(function(element) {
              if (element.className && element.className.indexOf('active') !== -1) {
                  element.classList.remove("active");
              }
          })
          //set 'active' to clicked element
          this.className += " active";
      });
    }
    

Здесь работает обновленный jsfiddle https://jsfiddle.net/tehLj8b5/2/

0 голосов
/ 22 мая 2018

Вы используете два атрибута "id" с одинаковым значением (<ul id="list-items-container"></ul>).На HTML-странице вам разрешено использовать только уникальные идентификаторы, это ваша проблема!

var header = [].slice.call(document.querySelectorAll('.list-items-container'));

header.forEach(function(hd) {
  var bts = [].slice.call(hd.querySelectorAll('.item'));
  
  bts.forEach(function(bt) {
    bt.addEventListener('click', function() {
      var current = document.querySelector('.item.active');
      current.className = current.className.replace(' active', '');
      this.className += ' active';
    });
  });
});
body {
  padding: 10px;
}

/* the list area  */

.list-area {
  background-color: #FC600A;
  border: 2px solid #000;
  display: inline-flex;
  width: 50%;
}

.list-items-container {
  padding: 0;
  width: 100%;
}

.list-items-container li {
  list-style: none;
  font-size: 35px;
  font-family: Corbel;
  color: #1489B8;
  padding: 0 10px 0 10px;
  width: 100%;
  transition: all .5s ease;
}

.list-items-container li:nth-child(odd) {
  background-color: #F7E0D4;
}

.list-items-container li:hover,
.list-items-container .active {
  color: red;
  cursor: pointer;
  padding-left: 50px;
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet"/>

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal1">
    Open modal 1
  </button>

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal2">
    Open modal 2
  </button>


<!-- The Modal 1-->
<div class="modal" id="modal1">
  <div class="modal-dialog">
    <div class="modal-content">

      <!-- Modal Header -->
      <div class="modal-header">
        <h4 class="modal-title">Modal Heading 11111</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>

      <div class="list-area">
        <ul class="list-items-container">
          <li class="item">item1</li>
          <li class="item">item2</li>
        </ul>
      </div>

      <!-- Modal footer -->
      <div class="modal-footer">
        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
      </div>

    </div>
  </div>
</div>

<!-- The Modal 2-->
<div class="modal" id="modal2">
  <div class="modal-dialog">
    <div class="modal-content">

      <!-- Modal Header -->
      <div class="modal-header">
        <h4 class="modal-title">Modal Heading 22222</h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>

      <div class="list-area">
        <ul class="list-items-container">
          <li class="item active">other1</li>
          <li class="item">other2</li>
        </ul>
      </div>

      <!-- Modal footer -->
      <div class="modal-footer">
        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
      </div>

    </div>
  </div>
</div>
...