如何在具有相同选项的其他选择中禁用,隐藏或删除所选选项?

时间:2019-05-13 15:49:48

标签: javascript html html-select

我正在写一个包含4个<select>元素的表单。它们都具有相同的选项,并且我想禁用,隐藏或从具有相同选项的其他<select>元素中的一个<select>中删除所选选项,以防止用户选择相同的选项多个<select>元素中的选项。

没有jQuery,请仅提供纯JavaScript。

如果可能,我希望第一个选项始终显示在所有<select>元素中:

<option class="select-items" selected>Sélectionnez..</option>

这是一个<select>的HTML:

<select class="custom-select  mb-3" id="name_typage_0">
  <option class="select-items" selected>Sélectionnez..</option>
  <option class="select-items" value="designation">Désignation</option>
  <option class="select-items" value="email">Email</option>
  <option class="select-items" value="ville">Ville</option>
  <option class="select-items" value="secteur_activite">Secteur d'activité</option>
</select>

这是我的JavaScript的一部分:

const custSelec = document.querySelectorAll('.custom-select');
custSelec.forEach(function(item){
   item.addEventListener('change', function(){
      if(item.options[item.selectedIndex].text == 'Sélectionnez..'){
         count = -1;
      }else{
         count = 1;
      total += count;
     compteur.textContent = ` ${total}/${custSelec.length -1}`;

3 个答案:

答案 0 :(得分:2)

change事件监听器中,您可以从组中的所有<select>元素中获取当前选定值的集合,然后循环浏览每个元素的选项以同时禁用当前在其他位置选择的选项。该组以及重新启用以前选择但此后已更改的所有选项。通过在禁用/启用选项之前检查该值,可以避免禁用每个选择中的第一个“标签”选项。

您可以使用相同的方法来隐藏或删除选项,但要记住,在尝试隐藏<option>元素时存在一些浏览器兼容性问题,如果需要,则需要一些其他代码来存储选项的完整列表您将要删除并还原它们。

const selects = document.querySelectorAll('.select-group');
selects.forEach((elem) => {
  elem.addEventListener('change', (event) => {
    let values = Array.from(selects).map(select => select.value);
    for (let select of selects) {
      select.querySelectorAll('option').forEach((option) => {
        let value = option.value;
        if (value &&  value !== select.value && values.includes(value)) {
          option.disabled = true;
        } else {
          option.disabled = false;
        }
      });
    }
  });
});
<select class="select-group">
  <option value="">Select...</option> 
  <option value="first">First Value</option> 
  <option value="second">Second Value</option>
  <option value="third">Third Value</option>
</select>
<select class="select-group">
  <option value="">Select...</option> 
  <option value="first">First Value</option> 
  <option value="second">Second Value</option>
  <option value="third">Third Value</option>
</select>
<select class="select-group">
  <option value="">Select...</option> 
  <option value="first">First Value</option> 
  <option value="second">Second Value</option>
  <option value="third">Third Value</option>
</select>

答案 1 :(得分:0)

非常感谢您的帮助!我添加了一个小“ if”来修复我的错误,它可以正常运行(直到下一个错误^^):

if(value !== ""){
option.disabled = true;
}

答案 2 :(得分:0)

或者我可以:

if (value && value !== select.value && values.includes(value) && value !== "") {
option.disabled = true;            
} 

开始时的另一个困难:学习编写简单的代码^^ z