如何根据第一个下拉列表过滤第二个下拉列表

how to filter 2nd drop-down list according to 1st drop-down list

我想根据第一个下拉列表过滤第二个下拉列表。

例如:如果我从第一个下拉列表中 select 'finance',第二个下拉列表将显示所有 'finance' 值(会计,属性保管人),如果我从第一个下拉列表中 select 'academic and research',则第二个下拉列表将显示所有 'academic and research' 值(职员,HiEd 图书管理员)。

这是我当前的代码,它不起作用:

第一个下拉列表:

 <select id="search_dept" type="text" name="dept" required>
     <option value="">Select Department</option>
     <option id="111" value="Finance">Finance</option>
     <option id="211" value="Academic and Research">Academic and Research</option>
 </select>

第二个下拉列表:

<select id="emp_table" type="text" name="position" required>
     <option value="">Select Position</option>
     <option id="111" value="Property Custodian">Property Custodian</option>
     <option id="111" value="Accountant">Accountant</option>
     <option id="211" value="Clerk">Clerk</option>
     <option id="211" value="HiEd Libririan">HiEd Libririan</option>
</select>

脚本:

<script>
    document.getElementById("search_dept").addEventListener("change", function() {
       // let toShow=':contains("'+this.value+'")';
       // console.log(toShow);
       $('#emp_table select option').hide();
       $('#emp_table select option:contains("'+this.value+'")').show();
    })
</script>

注意:您的第一个下拉值应该在第二个下拉值的开头

$(function() {
  $('#independent').on('change', function(e) {

    var selected = $('#independent').val().toUpperCase();
    var currentDep = $('#dependent').val().charAt(0).toUpperCase();
    var changedSelected = false;

    $('#dependent option').each(function() {

      var opt = $(this);
      var value = opt.val().charAt(0).toUpperCase();

      if (value !== selected) {

        opt.addClass('hide');
        opt.removeAttr('selected');

      } else {

        opt.removeClass('hide');

        if (!changedSelected) {

          opt.attr('selected', 'selected');
          changedSelected = true;

        } else {
          opt.removeAttr('selected');
        }
      }
    });
  });
});
.hide {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="independent">
  <option value="A"> A </option>
  <option value="B"> B </option>
</select>

<select id="dependent">
  <option value="A1"> A1 </option>
  <option value="A2"> A2 </option>
  <option value="A3"> A3 </option>
  <option value="B1"> B1 </option>
  <option value="B2"> B2 </option>
  <option value="B3"> B3 </option>
</select>

首先你不应该在 DOM 中有具有相同 id 的元素。
其次,您应该在第二个过滤器(例如类别)中具有过滤器属性。
在下面的代码中,您可以看到您的问题的工作示例,如果您有问题,请添加评论。

document.getElementById("search_dept").addEventListener("change", function() {
       const categoryId = $(this).find(':selected').attr('category');
       $('#emp_table option').hide();      
       $('#emp_table').val("");
       $('#emp_table option[category=' + categoryId + ']').show();
    })
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select id="search_dept" type="text" name="dept" required>
     <option value="">Select Department</option>
     <option id="1" category="1" value="Finance">Finance</option>
     <option id="2" category="2" value="Academic and Research">Academic and Research</option>
 </select>
 
<select id="emp_table" type="text" name="position" required>
     <option value="">Select Position</option>
     <option id="3" category="1" value="Property Custodian">Property Custodian</option>
     <option id="4" category="1" value="Accountant">Accountant</option>
     <option id="5" category="2" value="Clerk">Clerk</option>
     <option id="6" category="2" value="HiEd Libririan">HiEd Libririan</option>
</select>

不要为元素提供非唯一 ID。请改用数据属性。对于下面的示例,我提供了一个名为 "deptId" 的数据属性,并将其添加到选项中。

您可以创建一个 jQuery 插件,将下拉列表绑定到另一个。

(function() {
  $.fn.bindDropdown = function(bounded, dataAttr) {
    var $self = this, $bounded = $(bounded);
    $self.on('change', function() {
      if ($self.val() == null || $self.val() === '') {
        $bounded.find('option').show();
      } else {
        const id = $self.find('option:selected').data(dataAttr);
        $bounded.find('option').each(function() {
          $(this)[$(this).data('deptId') === id ? 'show' : 'hide']();
        });
        if (!$bounded.find('option:selected').is(':visible')) {
          $bounded.val(null);
        }
      }
    });
  };
})(jQuery);

$('#search_dept').bindDropdown('#emp_table', 'deptId');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="search_dept" type="text" name="dept" required>
  <option value="">Select Department</option>
  <option data-dept-id="111" value="Finance">Finance</option>
  <option data-dept-id="211" value="Academic and Research">Academic and Research</option>
</select>
<select id="emp_table" type="text" name="position" required>
  <option value="">Select Position</option>
  <option data-dept-id="111" value="Property Custodian">Property Custodian</option>
  <option data-dept-id="111" value="Accountant">Accountant</option>
  <option data-dept-id="211" value="Clerk">Clerk</option>
  <option data-dept-id="211" value="HiEd Libririan">HiEd Libririan</option>
</select>


您可以更进一步,通过添加选项使该插件更强大。您可以为源和目标提供函数或属性。

在这个例子中,我解耦了数据属性检查;并将其替换为函数回调(作为选项)。

function main() {
  $('#search-dept-1').bindDependency('#emp-table-1', {
    sourceFn: function() { return $(this).data('deptId'); },
    targetFn: function() { return $(this).data('deptId'); }
  });

  $('#search-dept-2').bindDependency('#emp-table-2', {
    sourceAttr: 'deptId',
    targetAttr: 'deptId'
  });
}

/* jquery.bind-select.js */
(function() {
  $.bindSelectDefaults = {
    sourceAttr: null,
    sourceFn: null,
    targetAttr: null,
    targetFn: null
  };
  var _getValue = function($ref, attr, fn) {
      return attr ? $ref.data(attr) : fn.call($ref, $ref);
    };
  $.fn.isVisible = function() {
    return this.is(':visible') || this.css('display') !== 'none';
  };
  $.fn.selectedOption = function() {
    return $(this.find('option:selected'));
  };
  $.fn.bindDependency = function(bounded, options) {
    var
      opts = $.extend(true, {}, $.bindSelectDefaults, options),
      $self = this, $bounded = $(bounded);
    $self.on('change', function() {
      if ($self.val() == null || $self.val() === '') {
        $bounded.find('option').show();
      } else {
        var
          $currOpt = $bounded.selectedOption(),
          sourceId = _getValue($self.selectedOption(), opts.sourceAttr, opts.sourceFn);
        $bounded.find('option')
          .hide()
          .each(function() {
            var $target = $(this),
              targetId = _getValue($target, opts.targetAttr, opts.targetFn);
            if (targetId === sourceId) {
              $(this).show();
            }
          });
        $bounded.val($currOpt.isVisible() ? $currOpt.val() : null);
      }
    });
  };
})(jQuery);

main();
html, body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}

body {
  display: flex;
  justify-content: center;
  align-items: center;
}

.page {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-row-gap: 2em;
  grid-column-gap: 0.5em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="page">
  <select id="search-dept-1" type="text" name="dept" required>
    <option value="">Select Department</option>
    <option data-dept-id="111" value="Finance">Finance</option>
    <option data-dept-id="211" value="Academic and Research">Academic and Research</option>
  </select>
  <select id="emp-table-1" type="text" name="position" required>
    <option value="">Select Position</option>
    <option data-dept-id="111" value="Property Custodian">Property Custodian</option>
    <option data-dept-id="111" value="Accountant">Accountant</option>
    <option data-dept-id="211" value="Clerk">Clerk</option>
    <option data-dept-id="211" value="HiEd Libririan">HiEd Libririan</option>
  </select>
  <select id="search-dept-2" type="text" name="dept" required>
    <option value="">Select Department</option>
    <option data-dept-id="111" value="Finance">Finance</option>
    <option data-dept-id="211" value="Academic and Research">Academic and Research</option>
  </select>
  <select id="emp-table-2" type="text" name="position" required>
    <option value="">Select Position</option>
    <option data-dept-id="111" value="Property Custodian">Property Custodian</option>
    <option data-dept-id="111" value="Accountant">Accountant</option>
    <option data-dept-id="211" value="Clerk">Clerk</option>
    <option data-dept-id="211" value="HiEd Libririan">HiEd Libririan</option>
  </select>
</div>