【问题标题】:Hide/Show rows based on multiple dropdown selections (filtering)基于多个下拉选择隐藏/显示行(过滤)
【发布时间】:2013-01-08 06:52:43
【问题描述】:

所以我的问题是这样的。我有一张桌子,我正在根据下拉菜单选择隐藏/显示行。想要的是两个菜单一起工作而不是独立工作。如果我在第一个下拉列表中选择一个项目,我希望能够使用第二个下拉列表进一步过滤该项目,依此类推,并使用任何其他下拉列表。这是我目前正在使用的独立工作的代码。

    <script>
$(document).ready(function(){
 $('select#age').bind('change',function(){
  if($(this).val()=='Show All'){
   $('td.age').parent().show();
  }else{
   $('td.age').parent().hide();
   $('td.age:contains("'+$(this).val()+'")').parent().show();
  }
  $('#counts').html( $('table.data_table tr:visible').length-1 + ' Registered Kids' )    
 })
  $('select#sport').bind('change',function(){
  if($(this).val()=='Show All'){
   $('td.sport').parent().show();
  }else{
   $('td.sport').parent().hide();
   $('td.sport:contains("'+$(this).val()+'")').parent().show();
  }
  $('#counts').html( $('table.data_table tr:visible').length-1 + ' Registered Kids' )    
 })
})
</script>

【问题讨论】:

  • 能不能把sn-p的数据表也发一下...
  • 您是在寻找表中数据的实际 sn-p 还是生成表本身的代码。抱歉,我在这里的键盘上睡着了。

标签: javascript jquery forms selection


【解决方案1】:
String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

$(document).ready(function() {
    var ddlFilterTableRow = $('select.ddlFilterTableRow'),
        headerCount = $('#headerCount');
          headerCount.html($('#tableRegisterKids').find('.Row').length + ' Registered Kids');

    ddlFilterTableRow.on('change', function() {
        ddlFilterTableRow.attr('disabled', 'disabled');

        var records = $('#tableRegisterKids').find('.Row');
        records.hide();

        var critriaAttributes = [];
        ddlFilterTableRow.each(function() {
            var $this = $(this),
                $selectedLength = $this.find(':selected').length,
                $critriaAttribute = '';

            if ($selectedLength > 0 && $this.val() != '0') {
                if ($selectedLength == 1) {
                    $critriaAttribute += '[data-' + $this.data('attribute') + '*="' + $this.val() + '"]';
                } else {
                    var $startDataAttribute = '[data-' + $this.data('attribute') + '*="',
                        $endDataAttribute = '"]',
                        $selectedValues = $this.val().toString();

                    $critriaAttribute += $startDataAttribute + $selectedValues.replaceAll(',', ($endDataAttribute + ',' + $startDataAttribute)) + $endDataAttribute;
                }
                critriaAttributes.push($critriaAttribute);
            }
        });

        var $showRecords = records;
        if (critriaAttributes.length > 0) {
            $.each(critriaAttributes, function(i, filterValue) {
                $showRecords = $showRecords.filter(filterValue);
            });
        }
        $showRecords.show();

        headerCount.html($showRecords.length + ' Registered Kids');

        ddlFilterTableRow.removeAttr('disabled');
    });
});

//=============================================== ====================//

<select id="ddlAge" class="ddlFilterTableRow" data-attribute="age">
    <option value="0">Select All</option>
    <option value="10">10</option>
    <option value="8">8</option>
    <option value="6">6</option>
</select>
<select id="ddlSport" class="ddlFilterTableRow" data-attribute="sports">
    <option value="0">Select All</option>
    <option value="Foot Ball">Foot Ball</option>
    <option value="Chess">Chess</option>
    <option value="Cricket">Cricket</option>
</select>
<h1 id="headerCount"></h1>
<table id="tableRegisterKids">
    <tr>
        <th>Fullname</th>
        <th>Age</th>
        <th>Sport</th>
    </tr>
    <tr class="Row" data-age="10" data-sports="Foot Ball">
        <td>Thulasiram.S</td>
        <td>10</td>
        <td>Foot Ball</td>
    </tr>
    <tr class="Row" data-age="8" data-sports="Cricket">
        <td>ST Ram</td>
        <td>8</td>
        <td>Cricket</td>
    </tr>
    <tr class="Row" data-age="6" data-sports="Chess">
        <td>Ram Kumar.S</td>
        <td>6</td>
        <td>Chess</td>
    </tr>
    <tr class="Row" data-age="8" data-sports="Chess">
        <td>Dinesh Kumar.S</td>
        <td>8</td>
        <td>Chess</td>
    </tr>
    <tr class="Row" data-age="6" data-sports="Foot Ball">
        <td>Raja Ram.S</td>
        <td>6</td>
        <td>Foot Ball</td>
    </tr>
    <tr class="Row" data-age="10" data-sports="Chess">
        <td>Priya</td>
        <td>10</td>
        <td>Chess</td>
    </tr>
</table>

请查找DEMO

【讨论】:

  • 你需要这样的输出吗?
  • 如何更新它以过滤数据属性中的逗号分隔列表?如果 data-sports="Chess, Cricket" 并从下拉列表中选择“Cricket”或“Chess”,我希望它成为结果的一部分。
  • @TheEUG: 请用下面的代码替换 critriaAttribute += '[data-' + $(this).data('attribute') + '*="' + $(this).val( ) + '"]';
  • @TheEUG:请通过演示链接找到更新的答案。
  • @TheEUG:此脚本适用于下拉菜单中的单选和多选。对于下拉多选,请添加两个附加属性,multiple="multiple" size="3" 演示:jsfiddle.net/YRea3/158
猜你喜欢
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2017-01-05
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多