【问题标题】:How can I filter Bootstrap cards with the use of a button?如何使用按钮过滤引导卡?
【发布时间】:2021-03-08 21:38:47
【问题描述】:

如何通过单击按钮过滤卡片?

我想在 java 脚本中创建一个函数并将其链接到按钮,但我不确定如何通过此方法过滤卡片。

假设我点击了博物馆按钮,我希望所有带有博物馆特色的卡片都保留下来,并且所有卡片都不会消失。

感谢您的帮助。

(HTML 可能需要一些修饰,但目前只是一个模型)

<div class="buttons">
  <h2><b>Choices:</b></h2>
  <button onclick="blank()">Clear</button>
  <button onclick="">Museums</button>
  <button onclick="">Bars</button>
</div>
<div class="row">
  <div class="col-sm-12 col-md-6 col-lg-4 space-top">
    <div class="card" style="width: 18rem;">
      <img src="img/sher.jpg" class="card-img-top" alt="sher">
      <div class="card-body">
        <h5 class="card-title">Sheridans</h5>
        <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
        <a href="#" class="btn btn-primary">Go here</a>
      </div>
    </div>
  </div>
  <div class="col-sm-12 col-md-6 col-lg-4 space-top">
    <div class="card" style="width: 18rem;">
      <img src="img/mus.jpg" class="card-img-top" alt="mus">
      <div class="card-body">
        <h5 class="card-title">Museum</h5>
        <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
        <a href="#" class="btn btn-primary">Go here</a>
      </div>
    </div>
  </div>
  <div class="col-sm-12 col-md-6 col-lg-4 space-top">
    <div class="card" style="width: 18rem;">
      <img src="img/dock.jpg" class="card-img-top" alt="dock">
      <div class="card-body">
        <h5 class="card-title">Docks</h5>
        <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
        <a href="#" class="btn btn-primary">Go here</a>
      </div>
    </div>
  </div>
</div>
<!-- end Rows -->
</div>
<!-- end Container -->
<script src="js/Cho_script.js"></script>

【问题讨论】:

    标签: javascript html bootstrap-5


    【解决方案1】:

    最简单的方法是为您的每张卡片添加一个类,无论是博物馆还是非博物馆,然后获取非博物馆卡片。或者,您可以抓取所有卡片,然后根据卡片标题的内容进行过滤,但这似乎更复杂。

    const toggleThese = document.getElementsByClassName('notMuseum')
    for (let i = 0; i < toggleThese.length; i++) {
      toggleThese[i].style.display = 'block'
    }
    
    function toggleMe() {
      for (let i = 0; i < toggleThese.length; i++) {
        if (toggleThese[i].style.display == 'block') {
          toggleThese[i].style.display = 'none'
        } else {
          toggleThese[i].style.display = 'block'
        }
      }
    }
    <div class="buttons">
      <h2><b>Choices:</b></h2>
      <button onclick="blank()">Clear</button>
      <button onclick="toggleMe()">Museums</button>
      <button onclick="">Bars</button>
    </div>
    <div class="row">
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card notMuseum" style="width: 18rem;">
          <img src="img/sher.jpg" class="card-img-top" alt="sher">
          <div class="card-body">
            <h5 class="card-title">Sheridans</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card Museum" style="width: 18rem;">
          <img src="img/mus.jpg" class="card-img-top" alt="mus">
          <div class="card-body">
            <h5 class="card-title">Museum</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card notMuseum" style="width: 18rem;">
          <img src="img/dock.jpg" class="card-img-top" alt="dock">
          <div class="card-body">
            <h5 class="card-title">Docks</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
    
      <!-- end Rows -->
    </div>
    <!-- end Container -->
    <script src="js/Cho_script.js"></script>

    下面是使用过滤器的方法:

    const cardObjects = document.getElementsByClassName('card')
    var cardArray = Object.values(cardObjects)
    
    
    function checkMuseum(item) {
      const cardTitle = item.getElementsByClassName('card-title')[0]  
      if (cardTitle.textContent != 'Museum')return item;
    }
    
    function myFunction() {  
      var notMuseum = cardArray.filter(checkMuseum);  
      for(let i = 0; i<notMuseum.length;i++){  
          if(notMuseum[i].style.display == ''|| notMuseum[i].style.display=='block'){ 
              notMuseum[i].style.display='none';
          }else{
              notMuseum[i].style.display='block';
          }
       } 
    }
    <div class="buttons">
      <h2><b>Choices:</b></h2>
      <button onclick="blank()">Clear</button>
      <button onclick="myFunction()">Museums</button>
      <button onclick="">Bars</button>
    </div>
    <div class="row">
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card notMuseum" style="width: 18rem;">
          <img src="img/sher.jpg" class="card-img-top" alt="sher">
          <div class="card-body">
            <h5 class="card-title">Sheridans</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card Museum" style="width: 18rem;">
          <img src="img/mus.jpg" class="card-img-top" alt="mus">
          <div class="card-body">
            <h5 class="card-title">Museum</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
      <div class="col-sm-12 col-md-6 col-lg-4 space-top">
        <div class="card notMuseum" style="width: 18rem;">
          <img src="img/dock.jpg" class="card-img-top" alt="dock">
          <div class="card-body">
            <h5 class="card-title">Docks</h5>
            <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit</p>
            <a href="#" class="btn btn-primary">Go here</a>
          </div>
        </div>
      </div>
    
      <!-- end Rows -->
    </div>
    <!-- end Container -->

    【讨论】:

    • 感谢您,非常感谢。
    【解决方案2】:

    一种简单的方法是添加/删除 Bootstrap d-none 类...

    <button onclick="clearAll()">Clear</button>
    <button onclick="filter('Museum')">Museums</button>
    <button onclick="filter('Bar')">Bars</button>
    
    
    var filter = (filter) => {
        const cards = document.getElementsByClassName("col-sm-12");
        for (let i = 0; i < cards.length; i++) {
            let title = cards[i].querySelector(".card .card-body .card-title");
            if (title.innerText.indexOf(filter) > -1) {
                cards[i].classList.remove("d-none")
            } else {
                cards[i].classList.add("d-none")
            }
        }
    }
    
    var clearAll = () => {
        cards = document.getElementsByClassName("col-sm-12")
        for (i = 0; i < cards.length; i++) {
            cards[i].classList.remove("d-none")
        }
    }
    

    Demo

    【讨论】:

    • 谢谢,这很有帮助!
    • 将其标记为已接受,以便其他人知道问题已解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2021-04-25
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多