【问题标题】:How to search group words in div panel如何在 div 面板中搜索组词
【发布时间】:2017-03-08 13:59:19
【问题描述】:

我制作这个fiddle 是为了向您展示我想要的东西。我有多个面板,里面有单词。面板内的每个单词都由<br>分隔。

我必须做一个过滤器并隐藏所有与搜索栏上的单词不匹配的面板。

示例:如果我在搜索栏中输入Hamburger Banana,那么我必须显示第一个面板并隐藏另一个。如果我输入 Banana Hamburger Eggs 这将不会显示任何内容。

您知道执行此操作的 javascript 库或 JQuery 方法吗?我看到了fusejs.io 它正是我想要的,但我看到它只是为了在 json 中搜索。

这是我的 HTML:

<div class="row" style="margin-top: 20px;margin-bottom: 20px;">
  <div class="col-md-12">
    <input type="text" class="form-control" placeholder="Search..." />
  </div>
</div>

<div class="row">
  <!-- FIRST PANEL -->
  <div class="col-sm-6">
    <div class="panel panel-default" style="min-height: 150px;">
      <div class="panel-body">
        Banana<br>
        Hamburger<br>
        Pizza<br>
        Cheese<br>
        Tomato<br>
      </div>
    </div>
  </div>

  <!-- SECOND PANEL -->
  <div class="col-sm-6">
    <div class="panel panel-default" style="min-height: 150px;">
      <div class="panel-body">
        One<br>
        Two<br>
        three<br>
        four<br>
      </div>
    </div>
  </div>
 </div>

 <div class="row">
  <!-- THRID PANEL -->
  <div class="col-sm-6">
    <div class="panel panel-default" style="min-height: 150px;">
      <div class="panel-body">
        Hey<br>
        Eggs<br>
        Stackoverflow<br>
      </div>
    </div>
  </div>

  <!-- FOURTH PANEL -->
  <div class="col-sm-6">
    <div class="panel panel-default" style="min-height: 150px;">
      <div class="panel-body">
        Search<br>
        Me<br>
        Please<br>
        Dude<br>
      </div>
    </div>
  </div>
 </div>

【问题讨论】:

    标签: javascript jquery search filter


    【解决方案1】:

    这是一种允许用户输入的方法,即:banana one eg(甚至小写)并使所有匹配字段保持可见:

    jsFiddle Demo

    $(function() {
    
      $('.form-control').on('input', function() {
    
        var val = $.trim(this.value).replace(/\s+/g,"|");
        var reg = new RegExp(val, "ig");
    
        $('.panel-body').show().filter(function() {
          return !this.textContent.match(reg);
        }).hide();
    
      });
    
    });
    

    虽然上面将向您显示所有包含其中一个查询词的框,
    如果您想只显示那些完全匹配的框完整的查询字符串:

    jsFiddle demo

    $(function() {
    
        var $panelBody = $('.panel-body');
    
      $('.form-control').on('input', function() {
    
        var val = $.trim(this.value).replace(/\s+/g,"|"),
            reg = new RegExp(val, "ig"),
            matchMax = [];
    
        if(!val) return $panelBody.show();
    
        $panelBody.show().text(function(i, v) {
          var r = v.match(reg);
          this.max = 0;
          if(r){
            matchMax.push(r.length);
            this.max = r.length;
          }
        }).filter(function() {
          return this.max < Math.max.apply( null, matchMax );
        }).hide();
    
      });
    
    });
    

    【讨论】:

    • 这真是太好了。我更喜欢像这样隐藏整个面板:jsfiddle.net/t0wL3u2g/4。可以在一个面板中搜索整个单词吗?例如hamburger one不匹配但hamburger tomato pizzahamburger banana会匹配?
    • 也许and 运算符应该更合适。但我不知道如何在正则表达式中做到这一点
    • @John 我会坚持第一个示例,似乎更有用,但无论如何还添加了一个示例,要求只有与所有查询词匹配的框。
    • 哦,非常好。这正是我所需要的。非常感谢你。我注意到了一些东西。如果我输入 banana skmfjnksjklsglmqhmgqhmgohglhs 这将返回一个结果而不是什么。正常吗?
    • @John 是的。因为banana 匹配,如果你在两个盒子里有“香蕉”这个词,两个盒子都会出现。如果您键入“香蕉一个”,则只有具有这两个术语的框才会可见(因此不是只有banana 的框)所以总结像asdfgahsdjg 这样的词将被忽略。您可以根据自己的具体要求调整代码...
    【解决方案2】:

    试试https://jsfiddle.net/d05yg03y/7/

    这应该删除多余的空格,接受不敏感的词

        $(".form-control").on('keyup', function() {
          var val = $(this).val().toLowerCase().trim().replace(/\s+/g, " ").replace(/[\n\r\t]/g, " ").split(" ");
        
          $(".col-sm-6").each(function() {
            var t = $(this);
            t.hide();
            $.each(val, function(a, v) {
              var h = t.text().toLowerCase().indexOf(v) > -1;
              if (h) {
                t.show();
                return false;
              }
        
            })
          });
        });
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
    
    <div class="row" style="margin-top: 20px;margin-bottom: 20px;">
      <div class="col-md-12">
        <input type="text" class="form-control" placeholder="Search..." />
      </div>
    </div>
    
    <div class="row">
      <div class="col-sm-6">
        <div class="panel panel-default" style="min-height: 150px;">
          <div class="panel-body">
            Banana<br>
            Hamburger<br>
            Pizza<br>
            Cheese<br>
            Tomato<br>
          </div>
        </div>
      </div>
      
      <div class="col-sm-6">
        <div class="panel panel-default" style="min-height: 150px;">
          <div class="panel-body">
            One<br>
            Two<br>
            three<br>
            four<br>
          </div>
        </div>
      </div>
     </div>
     
     <div class="row">
      <div class="col-sm-6">
        <div class="panel panel-default" style="min-height: 150px;">
          <div class="panel-body">
            Hey<br>
            Eggs<br>
            Stackoverflow<br>
          </div>
        </div>
      </div>
      
      <div class="col-sm-6">
        <div class="panel panel-default" style="min-height: 150px;">
          <div class="panel-body">
            Search<br>
            Me<br>
            Please<br>
            Dude<br>
          </div>
        </div>
      </div>
     </div>

    【讨论】:

    • 我们怎样才能避免其他面板瞄准与整个单词匹配的面板?示例:Hamburger banana将返回第一个面板,hamburger banana eggs将不返回任何内容
    • 向父级添加唯一id或为每个组添加一个类并选择类而不是$(".col-sm-6") select $(".targetted")
    • hamburger banana eggsHamburger banana hey onehamburger banana oneBanana one stackoverflowBanana one notFound anotherNotListed stackoverflow
    • 它不起作用。我不想要汉堡香蕉蛋的结果。但我需要汉堡香蕉的结果。对不起,我的问题是我的错误。我编辑了
    • 输入一个字母时出现问题。所有面板都消失了,当我清理搜索时,另一个面板保持隐藏状态
    【解决方案3】:

    您可以将函数绑定到输入。

    $(function() {
      $('.form-control').on('input', function() {
        $('.panel-body').show().not(':contains('+ this.value +')').hide();
      });
    });
    

    注意区分大小写

    Updated Fiddle

    更新

    对于多个单词(以空格分隔)使用此功能

    $(function() {
        $('.form-control').on('blur', function() {
        $('.panel-body').show();
        var val = $(this).val(),
                words = val.split(' '),
                selector = '.panel-body';
        $.each(words, function(i, val) {
            selector += ':not(:contains('+val+'))';
        })
        $(selector).hide();
      });
    });
    

    Updated Fiddle

    【讨论】:

    • 这是一个不错的方法。但是当我输入香蕉汉堡时,这将不起作用。我需要让它在这种情况下工作
    • @LinkinTED 为什么当我在我的第一个单词后键入一个空格,例如 Banana 这会显示所有其他面板?
    • 我对@9​​87654327@ 大错特错,因为它不适用于:contains :(
    • @John,如果你自己尝试了一些东西,我们不会生气的......价值被分割成一个空格。所以添加一个空格会在数组中添加一个空值。由于所有面板也确实有一个空的 val,因此它们将被显示。通过检查值长度来修复它...jsfiddle.net/d05yg03y/6
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多