RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1147042
Accepted
VanilJS
VanilJS
Asked:2020-06-29 22:26:25 +0000 UTC2020-06-29 22:26:25 +0000 UTC 2020-06-29 22:26:25 +0000 UTC

如何选择最多 3 张卡,使其余卡处于非活动状态,将所有内容写入本地存储并显示加载时的所有内容?

  • 772

您最多需要选择 3 张卡。
当达到限制时,关闭其余卡。
按 ID 的卡片被写入 localStorage。并且在加载页面时,我们按原样安排选择。
问题是加载时,并非所有非活动卡都变为非活动状态。并且您还可以选择更多限制。这似乎是一项初级任务,但它变成了不可能的事情。



jsFiddle https://jsfiddle.net/Vaniljs/19muw4d7/59/

const limit = 3;
var arrForCheckedItem = []; // массив для сохранения el в localStorage

document.addEventListener('click', ({ target: t }) => {
  if (t.classList.contains('product')) {
    if (!t.classList.contains('unchecked')) {
        arrForCheckedItem = []; // обнуляем массив, чтобы не копился
      t.classList.toggle('checked');
      document.querySelectorAll('.product.checked').forEach(i => {
    if (i.classList.contains('checked')) {
            arrForCheckedItem.push(i.dataset.productid); // Сохраняем выбранные el в массив
        }
    })
      localStorage.setItem('checked_items', arrForCheckedItem); // Сохраняем массив в localStorage
      const allChecked = document.querySelectorAll('.product.checked').length >= limit;
      document.querySelectorAll('.product:not(.checked)').forEach(n => {
        n.classList.toggle('unchecked', allChecked);
      });
    }
  }
  console.log(localStorage.getItem('checked_items')); // Проверка содержимого в localStorage
});




// ОТМЕЧАЕМ ВЫБРАННЫЕ И НЕВЫБРАННЫЕ ПРИ ЗАГРУЗКЕ СТРАНИЦЫ

window.addEventListener('load', () => {
    let arrFromStorage = localStorage.getItem('checked_items'); // выгружаем данные из localStorage
  let allCards = document.querySelectorAll('.product.slick-slide'); // выбираем все карточки
    if (arrFromStorage.length) { // если localStorage существует
        arrFromStorage.split(',').map(itemFromStorage => { // режем строку из localStorage в массив и перебираем
            allCards.forEach(itemProduct => {
                if (itemProduct.dataset.productid == itemFromStorage) { // если у карточки такой же id - отмечаем ее выбранной
                    itemProduct.classList.add('checked')
                } 
        if (document.querySelectorAll('.product.slick-slide.checked').length >= limit && itemProduct.dataset.productid != itemFromStorage) { // если у карточки не такой же id b выбранных меньше лимита - отмечаем ее не выбранной
                    itemProduct.classList.add('unchecked')
                }
            })
        })
    }
})
div:not(.product) {
    display: flex;
}

.product {
    display: block;
    width: 100px;
    height: 100px;
    margin: 20px;
    background-color: gray;
    border: 2px solid gray;
    cursor: pointer;
}

.product.checked {
    border: 2px solid green;
    background-color: lightgray;
}

.product.unchecked {
    border: 2px solid red;
    background-color: darkgray;
    cursor: not-allowed;
}
<div>
  <div class="product slick-slide" data-productid="1">1</div>
  <div class="product slick-slide" data-productid="2">2</div>
  <div class="product slick-slide" data-productid="3">3</div>
  <div class="product slick-slide" data-productid="4">4</div>
  <div class="product slick-slide" data-productid="5">5</div>
  <div class="product slick-slide" data-productid="6">6</div>
</div>

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. NocteFury
    2020-06-30T06:25:54Z2020-06-30T06:25:54Z

    从你的小提琴分叉:https ://jsfiddle.net/4h0cu1wo/

    在我看来,红色的选择应该使用 css 完成。因此,可以用红色突出显示所有没有班级的人.checked,但前提是父母有班级.limit。

    如果在此过程中您保存一个包含三个元素的数组的列表,然后将限制减少到一个,则只会选择第一个,因为加载实际上模拟了对卡片的连续点击。

    index.js:

    const limit = 3; // Какой лимит выделяемых элементов
    
    let selected = 0; // Количество выделенных на данный момент элементов
    
    const cards = document.getElementById('cards') // Ссылка на контейнер всех карточек
    cards.addEventListener('click', ({ target }) => {
        if (target.dataset.productid) select(target) // Если нажали по карточке, пытаемся ее выделить
    });
    
    window.addEventListener('load', () => load()); // Выполняем загрузку при запуске страницы
    
    // Выделение передаваемого элемента
    function select(element) {
        // Если лимит не достигнут или мы нажимаем по выделенному элементу...
        if (selected < limit || element.classList.contains('checked')) {
            element.classList.toggle('checked') // Переключаем .checked
            selected += element.classList.contains('checked') ? 1 : -1 // Если .checked был добавлен, инкрементируем счетчик
            cards.classList.toggle('limit', selected >= limit) // Если достигли лимита, добавляем класс .limit в контейнер
            if (selected >= limit) save() // А так же, при достижении лимита сохраняем полученный список
        }
    }
    
    // Сохранение списка выделенных карточек
    function save() {
        const items = []
        // Проодим по всем элементам, у которых есть класс .checked
        cards.querySelectorAll('.checked').forEach(element => items.push(element.dataset.productid));
        localStorage.setItem('checked_items', items); // Сохраняем их в LocalStorage
    }
    
    // Загрузка списка выделенных карточек
    function load() {
      const items = localStorage.getItem('checked_items');
      items.split(',').forEach(id => select(cards.querySelector(`[data-productid="${id}"]`))) // Передаем на выделение карточку с указанным id в dataset
    }
    

    索引.css:

    div#cards {
      display: flex;
    }
    
    .product {
      display: block;
      width: 100px;
      height: 100px;
      margin: 20px;
      background-color: gray;
      border: 2px solid gray;
      cursor: pointer;
    }
      
    .limit {
      .product {
        border: 2px solid red;
        background-color: darkgray;
    
        &:not(.checked) {
          cursor: not-allowed;
        }
      }
    }
     
    .product.checked {
      border: 2px solid green;
      background-color: lightgray;
    }
    

    索引.html:

    <div id="cards">
      <div class="product slick-slide" data-productid="1">1</div>
      <div class="product slick-slide" data-productid="2">2</div>
      <div class="product slick-slide" data-productid="3">3</div>
      <div class="product slick-slide" data-productid="4">4</div>
      <div class="product slick-slide" data-productid="5">5</div>
      <div class="product slick-slide" data-productid="6">6</div>
    </div>
    
    • 1
  2. Best Answer
    Roman Kozin
    2020-06-30T07:18:17Z2020-06-30T07:18:17Z

    window._cardsSelector = {
      _f: {},
      defaults: {
        cardsLimit: 3,
        selectors: {
          card: 'div.card'
        }
      }
    };
    
    window._cardsSelector._f.save = () => {
      let idList = [];
    
      $(`${window._cardsSelector.defaults.selectors.card}.selected`)
        .each((i, item) => {
          idList.push($(item).data('card-id'));
        });
    
      localStorage.setItem('selected_cards', JSON.stringify(idList));
    };
    
    window._cardsSelector._f.load = () => {
      let ids = JSON.parse(localStorage.getItem('selected_cards', '[]'));
      ids.forEach(i => $(`div.card[data-card-id=${i}]`).addClass('selected'));
      window._cardsSelector._f.check();
    };
    
    window._cardsSelector._f.check = () => {
      let limit = window._cardsSelector.defaults.cardsLimit,
        defaultSelector = $(`${window._cardsSelector.defaults.selectors.card}.selected`);
    
      if (defaultSelector.length === limit) {
        $(`${window._cardsSelector.defaults.selectors.card}:not(.selected)`)
          .addClass('disabled');
      } else {
        $(`${window._cardsSelector.defaults.selectors.card}.disabled`)
          .removeClass('disabled');
      }
    
      window._cardsSelector._f.save();
    };
    
    $(document).ready(function() {
      window._cardsSelector._f.load();
    
      $(window._cardsSelector.defaults.selectors.card)
        .click(function() {
          $(this).toggleClass('selected');
          window._cardsSelector._f.check();
        });
    });
    .cards {
      width: 98% !important;
      margin: 8px auto;
    }
    
    .cards>.card {
      display: flex;
      align-items: center;
      justify-content: center;
      min-height: 150px;
      max-width: 200px;
      padding: 12px;
      margin: 4px;
      box-shadow: 0 0 1px gray
    }
    
    .selected {
      background: rgba(0, 160, 0, 0.07);
    }
    
    .disabled {
      background: rgba(0, 0, 0, 0.07);
    }
    <script class="cssdeck" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    
    <div class="cards">
      <div class="card" data-card-id="1">
        Card Item 1
      </div>
      <div class="card" data-card-id="2">
        Card Item 2
      </div>
      <div class="card" data-card-id="3">
        Card Item 3
      </div>
      <div class="card" data-card-id="4">
        Card Item 4
      </div>
      <div class="card" data-card-id="5">
        Card Item 5
      </div>
      <div class="card" data-card-id="6">
        Card Item 6
      </div>
    </div>

    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5