使用每个div中元素中的文本进行搜索过滤

时间:2014-11-24 01:18:19

标签: javascript jquery filter filtering show-hide

我找到了一个小提琴,可以根据搜索框中使用的文本隐藏文本,但是无法弄清楚如何将此方法适用于包含多个元素的div。如何更改附加小提琴中的jQuery以使其过滤与输入的搜索匹配的div元素而不是列表项中找到的文本?

http://jsfiddle.net/point71echo/rof67uy6/2/

<input placeholder="Search Me" id="box" type="text" />

<ul class="navList">
    <li>apples</li>
    <li>apricots</li>
    <li>acai</li>
    <li>blueberry</li>
    <li>bananas</li>
    <li>cherry</li>
    <li>coconut</li>
    <li>donut</li>
    <li>durean</li>
</ul>


        <div class="connect-cat" catname="apples" style="visibility: visible; display: block;">
            <a href="/connect/apples">
                <div style="padding:5px;cursor:pointer;">
                    <div>
                        <img width="60" class="cat-logo" src="http://t2.gstatic.com/images?q=tbn:ANd9GcS0rYdTsHK-IwuWCNA_xXq44v76dFH2wPc5wdErF9yWHty-wqY4Bg" alt="apples">
                    </div>
                    <span>apples</span>
                </div>
            </a>
        </div>



        <div class="connect-cat" catname="apricots" style="visibility: visible; display: block;">
            <a href="/connect/apricots">
                <div style="padding:5px;cursor:pointer;">
                    <div>
                        <img width="60" class="cat-logo" src="http://t2.gstatic.com/images?q=tbn:ANd9GcS0rYdTsHK-IwuWCNA_xXq44v76dFH2wPc5wdErF9yWHty-wqY4Bg" alt="apricots">
                    </div>
                    <span>apricots</span>
                </div>
            </a>
        </div>

这是使用的jQuery:

$('#box').keyup(function(){
   var valThis = $(this).val().toLowerCase();
    if(valThis == ""){
        $('.navList > li').show();
    } else {
        $('.navList > li').each(function(){
            var text = $(this).text().toLowerCase();
            (text.indexOf(valThis) >= 0) ? $(this).show() : $(this).hide();
        });
   };
});

4 个答案:

答案 0 :(得分:12)

  

如果我需要在每个div框中添加另一个文本元素,是否有办法让每个div中的所有文本都可以搜索?这里有一个额外的文本元素 - jsfiddle.net/point71echo/mttgj1tt/1 - point71echo

这是一个在原生JavaScript中一次搜索两个元素的解决方案,没有任何库。

document.getElementById("box").onkeyup=function(){
  var matcher = new RegExp(document.getElementById("box").value, "gi");
  for (var i=0;i<document.getElementsByClassName("connect-cat").length;i++) {
    if (
      matcher.test(document.getElementsByClassName("name")[i].innerHTML) || 
      matcher.test(document.getElementsByClassName("category")[i].innerHTML)
    ) {
      document.getElementsByClassName("connect-cat")[i].style.display="inline-block";
    } else {
      document.getElementsByClassName("connect-cat")[i].style.display="none";
    }
  }
}

JSFiddle

如果你想使用jQuery使它更具可读性(那些愚蠢的长DOM函数):

$("#box").on('keyup', function(){
  var matcher = new RegExp($(this).val(), 'gi');
  $('.connect-cat').show().not(function(){
      return matcher.test($(this).find('.name, .category').text())
  }).hide();
});

JSFiddle

答案 1 :(得分:2)

这应该只匹配具有类connect-cat的div,并按里面的span进行过滤。

$('#box').keyup(function(){
   var valThis = $(this).val().toLowerCase();
    if(valThis === ""){
        $('div.connect-cat').show();
    } else {
        $('div.connect-cat').each(function(){
            var text = $(this).find('span').text().toLowerCase();
            if (text.indexOf(valThis) >= 0) { $(this).show(); }
            else { $(this).hide(); }
        });
   }
});

http://jsfiddle.net/reyjose/40u0var6/

答案 2 :(得分:1)

$('#box').keyup(function(){
    var valThis = $(this).val().toLowerCase();
        if(valThis == ""){
            $('.connect-cat').show();
        } else {
            $('.connect-cat').each(function(){
            var text = $(this).find("span").text().toLowerCase();
            (text.indexOf(valThis) >= 0) ? $(this).show() : $(this).hide();
        });
    };
});

如果您有多个&#34;跨度&#34;在div中,只需为其添加一个类名。然后改变

var text = $(this).find("span").text().toLowerCase();

为:

var text = $(this).find(".spanClassName").text().toLowerCase();

答案 3 :(得分:0)

使用每个div点击按钮中的元素中的文字进行搜索过滤: enter image description here