过滤提交

时间:2016-02-02 18:15:24

标签: javascript jquery

我尝试创建一个动态搜索过滤器,该过滤器将显示/隐藏某些州和城市的属性,并根据搜索结果更新显示的属性数量。

我能够部分地获得一些工作,但是当涉及动态计数时,某些东西是不起作用的。

首先,我要设置HTML:



var numProperties = $('.c-property:visible').length;

$('.c-properties-summary__count').html(numProperties);

$('.c-search').submit(function(e){
    e.preventDefault();

    var userData = $('input[type="search"]').val().toLowerCase();

    $('.c-property').each(function(){
        var propertyState = $(this).data('state'),
            propertyCity  = $(this).data('city'),
            numProperties = $('.c-property:visible').length;

        if (userData.length) {
            if (userData === propertyState) {
                $(this).show();
            } else if (userData === propertyCity) {
                $(this).show();
            } else {
                $(this).hide();
            }
        } else {
            $(this).show();
        }

        $('.c-properties-summary__count').html(numProperties);
    });
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="c-properties-summary">
    <h3><span class="c-properties-summary__count"></span> Properties</h3>
</div>

<form class="c-search" action="/">
    <label for="location">Location</label>
    <input name="location" type="search" value="" placeholder="State or City">
    <input class="c-btn c-btn--blue" type="submit" value="Filter">
</form>

<ul class="c-properties">
    <li class="c-property" data-state="az" data-city="avondale">Avondale</li>
    <li class="c-property" data-state="az" data-city="tempe">Tempe</li>
    <li class="c-property" data-state="az" data-city="phoenix">Phoenix</li>
    <li class="c-property" data-state="al" data-city="birmingham">Birmingham</li>
    <li class="c-property" data-state="fl" data-city="tallahassee">Tallahassee</li>
</ul>
&#13;
&#13;
&#13;

截至目前,脚本似乎只在第一次尝试时起作用。例如,如果我尝试搜索AZ,它会隐藏所有其他属性并返回正确的3计数。现在,如果我立即尝试另一次搜索FL,它会正确隐藏所有其他属性,但显示的计数不正确,即使只显示一个属性,它也显示为2。

我已经在这几个小时了,所以如果有人能提供一些指导,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

无需使用任何循环进行搜索。假设您有10000个数据,那么肯定会影响您的网页性能。

尝试以下较短的代码,而不是使用长代码。

&#13;
&#13;
function startSearching() {
    $("ul.c-properties li").show();
    var strUserInput = $.trim($('input[type="search"]').val().toLowerCase());
    if (strUserInput)
    {
        $("ul.c-properties li").hide();
        $('li[data-state*="' + strUserInput + '"]').show();
        $('li[data-city*="' + strUserInput + '"]').show();
    }
 }
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="c-properties-summary">
    <h3><span class="c-properties-summary__count"></span> Properties</h3>
</div>

<form class="c-search" action="/">
    <label for="location">Location</label>
    <input name="location" type="search" value="" placeholder="State or City">
    <input class="c-btn c-btn--blue" type="button" value="Filter" onclick="startSearching()">
</form>

<ul class="c-properties">
    <li class="c-property" data-state="az" data-city="avondale">Avondale (az)</li>
    <li class="c-property" data-state="az" data-city="tempe">Tempe (az)</li>
    <li class="c-property" data-state="az" data-city="phoenix">Phoenix (az)</li>
    <li class="c-property" data-state="al" data-city="birmingham">Birmingham (al)</li>
    <li class="c-property" data-state="fl" data-city="tallahassee">Tallahassee (fl)</li>
</ul>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

修正了它。检查下面的我的代码段。你需要把这些陈述:

numProperties = $('.c-property:visible').length;
$('.c-properties-summary__count').html(numProperties);

在您使用课程li遍历每个c-property的街区外

<强>段:

var numProperties = $('.c-property:visible').length;

$('.c-properties-summary__count').html(numProperties);

$('.c-search').submit(function(e) {
  e.preventDefault();
  var userData = $('input[type="search"]').val().toLowerCase();
  $('.c-property').each(function() {
    var propertyState = $(this).data('state'),
      propertyCity = $(this).data('city');
    $(this).toggle(!userData || userData === propertyState || userData === propertyCity);
  });
  numProperties = $('.c-property:visible').length;
  $('.c-properties-summary__count').html(numProperties);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="c-properties-summary">
  <h3><span class="c-properties-summary__count"></span> Properties</h3>
</div>

<form class="c-search" action="/">
  <label for="location">Location</label>
  <input name="location" type="search" value="" placeholder="State or City">
  <input class="c-btn c-btn--blue" type="submit" value="Filter">
</form>

<ul class="c-properties">
  <li class="c-property" data-state="az" data-city="avondale">Avondale</li>
  <li class="c-property" data-state="az" data-city="tempe">Tempe</li>
  <li class="c-property" data-state="az" data-city="phoenix">Phoenix</li>
  <li class="c-property" data-state="al" data-city="birmingham">Birmingham</li>
  <li class="c-property" data-state="fl" data-city="tallahassee">Tallahassee</li>
</ul>