【问题标题】:how to populate and remove options in html select如何在 html 选择中填充和删除选项
【发布时间】:2019-01-22 07:49:36
【问题描述】:

我有四个下拉菜单和四个选项,所有四个下拉菜单都有相同的选项。如果用户从当前下拉列表中选择一个选项,我正在尝试删除其他三个下拉列表中的选项。如果用户再次使用新值进行更改,则应删除新值选项,并且应在其他下拉列表中再次填充旧值。我做了一些事情,但没有按预期工作。

参考以下jsFiddle(更新):http://jsfiddle.net/ruq1jb0c/5/

$('.inputcontrol').change(function() {
  var fields = ['Employee', 'Status', 'State', 'Supervisor'];
  var value = $(this).val();
  $('.inputcontrol').not(this).find('option').each(function() {
    if ($(this).val() == value) {
      $(this).remove()
    }
  });

  $('.inputcontrol').each(function() {

    for (var i = 0; i < fields.length; i++) {
      if (fields[i] != value) {
        if ($(this).find("option[value=" + fields[i] + "]").length == 0) {
          $(this).append("<option value=" + fields[i] + ">" + fields[i] + "</option>");

        }
      }

    }

  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="field1" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field2" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field3" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field4" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>

【问题讨论】:

  • 你有什么尝试吗?给我们一些代码
  • 是的,请参阅上面的链接@sayalok
  • 我们不清楚,你想做什么?你能解释一下吗??
  • 您应该在问题中包含您的代码/jsfiddle,而不是在评论部分。

标签: javascript jquery


【解决方案1】:

好的,这里有一个例子可以让这更简单。 阅读评论以了解其工作原理

var selectedFields = ['Employee', '', '', ''] // here is all selected Value for each dropdownList is saved
var drps = $(".inputcontrol");
function validate(){
drps.each(function(index, item){
      $(this).attr("index", index); // This is important where $(this).index() are not working 
     $(this).find("option").show(); // reset all option to visible
     var v = $(this).val();
     $.each(selectedFields, function(subIndex, subItem){
        if (index > subIndex) // here we hide all previews selected values 
            $(item).find("option[value='"+subItem+"']").hide();
     });
  });
}

drps.change(function(){
  var itemIndex = eval($(this).attr("index")); 
  selectedFields[itemIndex] = $(this).val()
  drps.each(function(index, item){ // reset all values of dropdown that are after the current dropdown
    if (index > itemIndex) {
        $(this).val("none")
        selectedFields[index] ="";
     }
  });
  validate();
});

validate();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select id="field1" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field2" class="inputcontrol">
  <option selected="selected" value="none">none</option>
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field3" class="inputcontrol">
  <option selected="selected" value="none">none</option>
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field4" class="inputcontrol">
 <option selected="selected" value="none">none</option>
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>

【讨论】:

  • 太棒了!有用。选项将再次填充,但用户将无法选择重复值。非常感谢,我很感激。
【解决方案2】:

尝试使用类和addClass & removeClass

在更改时找到具有hide 类的选项并添加或删除它

$('.inputcontrol').change(function(e) {
  $('.inputcontrol').find('option.hide').removeClass('hide');
  $('.inputcontrol').not(this).find('option[value="' + e.target.value + '"]').addClass('hide');
});
.hide {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="field1" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field2" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field3" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<select id="field4" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>

【讨论】:

  • 不,它不能正常工作,我仍然可以在其他下拉菜单中看到相同的选定选项
  • 因为您已选择默认Employee。删除它并在未选择任何内容时添加另一个选项
  • 我添加了空值,仍然可以在其他下拉列表中看到选定的选项,请以其他方式帮助我
【解决方案3】:

校验码cmets

$('select').change(function() {
  
  // get id to exclude from hiding
  var id = $(this).attr('id');
  
  // get value select for option hiding reference
  var val = $(this).val();
  
  // unhide all options
  $('select option').css('display', 'block');
  
  // loop through all select except the changed one
  // and hide all options with value from changed select
  $('select:not(#' + id + ')').each(function() {
    $(this).find('option[value="' + val + '"]').css('display', 'none');
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="field1" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field2" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field3" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>
<br><br>
<select id="field4" class="inputcontrol">
  <option value="Employee">Employee</option>
  <option value="Status">Status</option>
  <option value="State">State</option>
  <option value="Supervisor">Supervisor</option>
</select>

【讨论】:

    【解决方案4】:

    这有所作为:(如在您的 jsfiddle 链接中)

    if($(this).val()===value)
            $(this).hide()
     else  $(this).show() // this will unhide previously hidden options 
    

    而不是'=='

    jsFiddle

    【讨论】:

    • 不,如果您看到所选值仍填充在其他下拉列表中,则它没有按预期工作
    • @Sanjay 当前选择的值对其他人隐藏。并在选择更改后恢复。这就是我认为你所要求的。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2019-11-24
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多