javascript - jQuery通过两个选择输入按数据属性进行过滤

标签 javascript jquery html css

我在通过两个不同的输入来过滤jQuery的结果div时遇到麻烦。用户可以决定按办公室,专业或同时按办公室和专业进行筛选。过滤是根据div上与选择输入值相对应的数据属性设置的。

<div>
  <label for="officeSearch">Search by office:</label>
  <select name="Office Search" id="officeSearch">
    <option value="all"></option>
    <option value="communication">Communication</option>
    <option value="internal medicine">Internal Medicine</option>
  </select>
</div>
<div>
  <label for="specialtySearch">Search by specialty:</label>
  <select name="Specialty Search" id="specialtySearch">
    <option value="all"></option>
    <option value="Bone Cancer">Bone Cancer</option>
    <option value="Breast Cancer">Breast Cancer</option>
    <option value="Oral Cancer">Oral Cancer</option>
  </select>
</div>

<div class="module-sm profile" data-office="communication" data-specialty="Oral Cancer">
  <p>Person A</p>
</div>
<div class="module-sm profile" data-office="communication" data-specialty="Breast Cancer">
  <p>Person B</p>
</div>
<div class="module-sm profile" data-office="internal medicine" data-specialty="Bone Cancer">
  <p>Person C</p>
</div>


这是我使用的jQuery,它在选择更改时触发:

$(document).ready(function() {
  $("#officeSearch").on('change', function(){
    var selectedOffice = $('#officeSearch').val();
    var selectedSpecialty = $('#specialtySearch').val();
    var person = $('#filterList .profile').not('.out');
    var allPersons = $('#filterList .profile');
    var allPersonsOffice = $('#filterList .profile').data('office');
    var allPersonsOut = $('#filterList .profile.out');

    var office = $('.profile[data-office="' + selectedOffice +'"]');

    alert(''+ selectedOffice + ' ' + selectedSpecialty +'');

    if (selectedOffice == 'all' && selectedSpecialty == 'all'){
        $(allPersons).removeClass('out').fadeIn(500);
    }
    else {
        $(person).not(office).addClass('out').fadeOut(500);
        office.removeClass('out').fadeIn(500);
    }
  });
  $("#specialtySearch").on('change', function(){
    var selectedOffice = $('#officeSearch').val();
    var selectedSpecialty = $('#specialtySearch').val();
    var person = $('#filterList .profile').not('.out');
    var allPersons = $('#filterList .profile');
    var allPersonsOffice = $('#filterList .profile').data('office');
    var allPersonsOut = $('#filterList .profile.out');

    var specialty = $('.profile[data-specialty="' + selectedSpecialty +'"]');

    alert(''+ selectedOffice + ' ' + selectedSpecialty +'');

    if (selectedOffice == 'all' && selectedSpecialty == 'all'){
        $(allPersons).removeClass('out').fadeIn(500);
    }
    else {
        $(person).not(specialty).addClass('out').fadeOut(500);
        specialty.removeClass('out').fadeIn(500);
    }
  });
});


如果有帮助,我会做一个codepen来演示我正在尝试做的事情以及到目前为止的位置。

我已经进行了一些搜索,并且一直在努力寻找如何使它工作数周的时间。任何使此代码更简洁的帮助或其他人如何解决此问题的示例,将不胜感激!

最佳答案

从任一选择更改中调用一次更新。
根据选择创建一个过滤器(附加)。
隐藏不在比赛中的那些
显示比赛。


JSFiddle:http://jsfiddle.net/TrueBlueAussie/2u7NY/

$(document).ready(function () {
    var onChange = function () {

        var selectedOffice = $('#officeSearch').val();
        var selectedSpecialty = $('#specialtySearch').val();
        var filter = "#filterList .profile";
        var allPersons = $(filter);
        if (selectedOffice != "all")
        {
            filter += '[data-office="' + selectedOffice + '"]'
        }
        if (selectedSpecialty != "all")
        {
            filter += '[data-specialty="' + selectedSpecialty + '"]'
        }
        var $matching = allPersons.filter(filter);
        $(allPersons).not($matching).removeClass('out').fadeOut(500);
        $matching.removeClass('out').fadeIn(500);        
    }

    $("#officeSearch, #specialtySearch").on('change', onChange );
});


更新:http://jsfiddle.net/TrueBlueAussie/2u7NY/2/

过滤器可以稍微提高效率,因为不需要“ #filterList .profile”即可基于属性过滤allPersons

我还删除了函数变量,并将函数内联到更改事件上。

$(document).ready(function () {
    $("#officeSearch, #specialtySearch").on('change',
        function () {
            var selectedOffice = $('#officeSearch').val();
            var selectedSpecialty = $('#specialtySearch').val();
            var allPersons = $("#filterList .profile");
            var filter = "";
            if (selectedOffice != "all") {
                filter = '[data-office="' + selectedOffice + '"]'
            }
            if (selectedSpecialty != "all") {
                filter += '[data-specialty="' + selectedSpecialty + '"]'
            }
            var $matching = allPersons.filter(filter);
            $(allPersons).not($matching).removeClass('out').fadeOut(500);
            $matching.removeClass('out').fadeIn(500);
        });
});

关于javascript - jQuery通过两个选择输入按数据属性进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23832258/

相关文章:

javascript - 更改样式属性值

javascript - 将元素属性放入输入值

javascript - 如何使用 jQuery validate 手动触发验证?

javascript - 将 Json 响应保存到数组的方法

javascript - Angular UI-Grid - 当自定义指令更新单元格值时,事件 afterCellEdit 不会触发

jquery - 试图让页面在 x 时间后滚动到新的 div 不起作用

javascript - 给每个元素一个唯一的ID

html - 在 SPAN 上激活溢出省略号,但如果可能的话也环绕/使用高度

javascript - 仅使用HTML将参数传递给<a> href标记内的链接

javascript - 如何在移动端用CSS和JavaScript实现半圆菜单(子项)?