【问题标题】:Filter cards in Bootstrap 4 with jQuery使用 jQuery 在 Bootstrap 4 中过滤卡片
【发布时间】:2016-04-04 19:23:51
【问题描述】:

我正在尝试使用 bootstrap 4 的新卡片组件创建一个由许多卡片填充的页面。

我想创建一个搜索栏,在搜索时过滤掉标题与搜索查询不匹配的卡片。

这是我的想法。 Plunker

我希望卡片获得类似display: noneopacity:0(如果它们不匹配)的信息。

我目前正在尝试编写搜索栏的onChange 执行此操作的函数。如果我能弄清楚,我会发布。

我也尝试过使用内置的 sn-p 功能。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/twbs/bootstrap/v4-dev/dist/js/bootstrap.js"></script>
<link href="https://cdn.rawgit.com/twbs/bootstrap/v4-dev/dist/css/bootstrap.css" rel="stylesheet" />

<div class="container">
  <div class="row">
    <div class="col-sm-4">
      <input type="search" placeholder="Search......" name="search" class="searchbox-input" onkeyup="buttonUp();" required>
    </div>
    <div class="col-sm-4">
    </div>
    <div class="col-sm-4">
    </div>
  </div>
  <div class="card-columns">
    <div class="card">
      <div class="card-block">
        <h4 class="card-title">Card title that wraps to a new line</h4>
        <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
      </div>
    </div>
    <div class="card card-block">
      <blockquote class="card-blockquote">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
        <footer>
          <small class="text-muted">
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
        </footer>
      </blockquote>
    </div>
    <div class="card">
      <div class="card-block">
        <h4 class="card-title">Card title</h4>
        <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
        <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small>
        </p>
      </div>
    </div>
    <div class="card card-block card-inverse card-primary text-xs-center">
      <blockquote class="card-blockquote">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat.</p>
        <footer>
          <small>
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
        </footer>
      </blockquote>
    </div>
    <div class="card card-block text-xs-center">
      <h4 class="card-title">Card title</h4>
      <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small>
      </p>
    </div>
    <div class="card">
    </div>
    <div class="card card-block text-xs-right">
      <blockquote class="card-blockquote">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
        <footer>
          <small class="text-muted">
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
        </footer>
      </blockquote>
    </div>
    <div class="card card-block">
      <h4 class="card-title">Card title</h4>
      <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small>
      </p>
    </div>
  </div>
</div>

【问题讨论】:

  • 您要过滤什么?标题?文字?
  • 暂时标题,抱歉,我以为我把它放进去了。

标签: javascript jquery twitter-bootstrap twitter-bootstrap-4 bootstrap-4


【解决方案1】:

这是一个使用 jQuery 的 contains selector 的简单示例:

$('.searchbox-input').change( function () {
    $('.card').show();
    var filter = $(this).val(); // get the value of the input, which we filter on
    $('.container').find(".card-title:not(:contains(" + filter + "))").parent().css('display','none');
});

目前这设置为在更改搜索输入时发生,您可能希望设置一个提交按钮并让它在提交时触发。

Bootply Example

【讨论】:

  • 完美,正是我想要的,我之前没有使用过 contains 选择器。谢谢!
  • 对不起,我之前链接错误的 jQuery 文档页面,实际上是 contains selector。现在更新了。乐于助人!
  • 此代码无法重置过滤器以显示所有卡片,此外,过滤卡片时,不会显示标题。
  • @APAD1 这看起来真的很有用,如果你清空搜索字符串,如何将它们重置为正常?
【解决方案2】:

这是一个简单的解决方案。

$(document).ready(function(){
  $('.searchbox-input').on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $(".card").filter(function() {
      $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
    });
  });
});

【讨论】:

    【解决方案3】:

    这里有一些更现代的选项,它们对 Bootstrap 4 或 Bootstrap 5 友好...

    引导程序 5(使用 JavaScript)

    var buttonUp = () => {
        const input = document.querySelector(".searchbox-input");
        const cards = document.getElementsByClassName("card");
        let filter = input.value
        for (let i = 0; i < cards.length; i++) {
            let title = cards[i].querySelector(".card-body");
            if (title.innerText.indexOf(filter) > -1) {
                cards[i].classList.remove("d-none")
            } else {
                cards[i].classList.add("d-none")
            }
        }
    }
    
    

    Demo

    引导程序 4(使用 jQuery)

    // this overrides `contains` to make it case insenstive
    jQuery.expr[':'].contains = function(a, i, m) {
      return jQuery(a).text().toUpperCase()
          .indexOf(m[3].toUpperCase()) >= 0;
    };
    
    var buttonUp = () => {
        $('.card').removeClass('d-none');
        var filter = $(this).val(); // get the value of the input, which we filter on
        $('.card-deck').find('.card .card-body h4:not(:contains("'+filter+'"))').parent().parent().addClass('d-none');
    }
    

    Demo

    【讨论】:

      【解决方案4】:
      $(document).ready(function() {
          $('#searchForm').keyup(function(){
              search_text($(this).val());
          });
      
          function search_text(value){
              $('#search_section .card').each(function(){
                  var found = 'false';
                  $(this).each(function(){
                      if($(this).text().toLowerCase().indexOf(value.toLowerCase()) >= 0)
                      {
                          found = 'true';
                      }
                  });
                  if(found == 'true'){
                      $(this).show()
                  }
                  else {
                      $(this).hide();
                  }
              })
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-06
        • 2016-03-12
        • 1970-01-01
        • 2018-08-30
        • 2021-12-04
        • 2017-02-01
        • 1970-01-01
        相关资源
        最近更新 更多