【问题标题】:How to disable selected value in other chosen select & close selected option in single chosen select如何在单个选择的选择中禁用其他选择的选择和关闭选择的选项中的选择值
【发布时间】:2018-10-09 23:16:43
【问题描述】:

我正在使用 Chosen select 版本 1.8.7,我有 3 个并排选择,它从数据库表中提取选项。

如果我在第一个选择的选择中选择选项 1,那么该选项应该在第二个和第三个选择的选择中被禁用,如果我在第二个选择的选择中选择选项 2,那么该值应该在第一个和第三个选择的选择中被禁用,如果我在第三个选择中选择选项 3,那么它应该在第一个和第二个选择中被禁用。

我还想从选择的选择中删除选定的选项,例如多选,但我只想使用单选。我在 Chosen select 的文档中没有找到这个。

这是我的代码:

Check fiddle

<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="1">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>
<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="2">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>
<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="3">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>

//This makes chosen select the first matching result from the list
//if you wrote anything on the input element (and it matches
//anything). 
$('select').chosen();

$container1 = $('#select1').next();
$('input', $container1).change(function() {
  var value = $('.active-result:first', $container1).text();
  if (value !== undefined) {
    $('#select1').data('chosen').result_select(value);
  }
});

//Alternatively you could achieve the same with something like
//this, but it's getting a bit complicated:
var $container2 = $('#select2').next();
$('input', $container2).change(function() {
  var option_index = $('.chosen-container .active-result:first').data("option-array-index");
  if (option_index !== undefined) {
    var option_value = $('#select2 option:nth-child(' + (option_index + 1) + ')').val();
    $('#select2').val(option_value);
    $('#select2').trigger("chosen:updated");
  }
});
body {
  margin: 10px;
}

select {
  width: 200px;
}

tr>td:first-child {
  text-align: right;
  padding-right: 7px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/chosen/1.1.0/chosen.css" rel="stylesheet" />
<script src="http://cdnjs.cloudflare.com/ajax/libs/chosen/1.1.0/chosen.jquery.js"></script>
<table>
  <tr>
    <td>
      <label for="select1">Using Chosen#result_select method</label>
    </td>
    <td>
      <select id="select1" class="first" multiple>
        <option value="1">abc</option>
        <option value="2">def</option>
        <option value="3">ghi</option>
      </select>
    </td>
  </tr>
  <tr>
    <td>
      <label for="select2">Using other means...</label>
    </td>
    <td>
      <select id="select2" class="second" multiple>
        <option value="1">abc</option>
        <option value="2">def</option>
        <option value="3">ghi</option>
      </select>
    </td>
  </tr>
</table>

【问题讨论】:

  • 我已经在关闭选定选项时得到了解决方案,现在我想在其他选择中禁用选定选项
  • 我已经更新了我的小提琴,它适用于取消选择选项,我尝试禁用选定的选项,但它不起作用请检查这个小提琴。 jsfiddle.net/deqngcmz/7
  • 您可以让 onchange 事件侦听器函数收集每个选择的选定值。然后,您有多种方法可以从其他选择中删除相同的值。您可以使用 jQuery .css() 函数来隐藏重复的 &lt;option&gt;。请记住在取消选择功能中将其反转。
  • 当我使用 bootstrap 时它不起作用,谁能告诉我我的代码中的错误是什么。检查这个小提琴jsfiddle.net/j14cfvt0/3
  • 我建议打开一个新问题而不是删除这个问题。 @乔恩

标签: javascript jquery html jquery-chosen


【解决方案1】:
<form>
<div id="container">
  <div id="content">
    <div class="side-by-side clearfix">
    <select data-placeholder="Choose a Country..." id="1" class="chosen-select" tabindex="1">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
     </select>
     <select data-placeholder="Choose a Country..." id="2" class="chosen-select" tabindex="2">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
     </select>
     <select data-placeholder="Choose a Country..." id="3" class="chosen-select" tabindex="3">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
    </select>
    <select data-placeholder="Choose a Country..." id="4" class="chosen-select" tabindex="4">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
    </select>
    <select data-placeholder="Choose a Country..." id="5" class="chosen-select" tabindex="5">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
    </select>
    <select data-placeholder="Choose a Country..." id="6" class="chosen-select" tabindex="6">
                <option value=""></option>
                <option value="United States">United States</option>
                <option value="United Kingdom">United Kingdom</option>
                <option value="Afghanistan">Afghanistan</option>
                <option value="Aland Islands">Aland Islands</option>
                <option value="Albania">Albania</option>
                <option value="Algeria">Algeria</option>
    </select>
    </div>
  </div>
</div>
<script src="https://harvesthq.github.io/chosen/docsupport/jquery-3.2.1.min.js" type="text/javascript"></script>
<script src="https://harvesthq.github.io/chosen/chosen.jquery.js" type="text/javascript"></script>
<script src="https://harvesthq.github.io/chosen/docsupport/prism.js" type="text/javascript" charset="utf-8"></script>
<script src="https://harvesthq.github.io/chosen/docsupport/init.js" type="text/javascript" charset="utf-8"></script>
</form>
<script>
var selected=[];
$.each($('.chosen-select'), function(){
    selected[$(this).attr('id')] = '';
});

$('.chosen-select').change(function() {
    var value = $(this).val();
    if(selected[$(this).attr('id')] !== ''){
        var oldValue = selected[$(this).attr('id')];
        $(this).siblings('.chosen-select').addBack().children('option').each(function() {
            if($(this).val() === oldValue)
                $(this).removeAttr('disabled').trigger('chosen:updated');
        });        
    }
    selected[$(this).attr('id')] = value;
    $(this).siblings('.chosen-select').addBack().children('option').each(function() {
        if($(this).val() === value)
            $(this).attr('disabled', true).trigger('chosen:updated');
    });
});
</script>

【讨论】:

  • 我得到了删除选定选项的解决方案,现在我想实现如果选择了该选项,那么该选项在所有下拉菜单中都被禁用。检查我的小提琴jsfiddle.net/deqngcmz/7
  • 你懂的,请解释一下
  • 我更新了脚本。 vanilla JS 和 jQuery 都禁用选定的值。存储的结果不同:js 版本为每个 Select 提供混合数组及其选定的值,jQuery 版本来自您的 Fiddle 脚本,选定的值只是推入数组。
  • 不知怎的,我设法错过了这个问题是关于选择的。 (我责怪年龄......或恶劣的天气或其他东西:))对不起'回合。我相应地更改了脚本。
  • 它现在可以工作了,但是当我更改选项时,它应该再次启用它不起作用
【解决方案2】:

既然你说你找到了删除已选择值的选项,我只研究了如何“删除”,或者在这种情况下,“禁用”,从一个选择中选择的值在另一个选择中。

请注意,此示例使用 jQuery,因此必须包含一个 jQuery 库才能使其工作。

你可以做的是有一个事件监听器来触发你的下拉元素上的onchange。然后,您可以检查已选择的内容、先前选择的内容以及是否进行了其他选择。

然后,通过查看之前选择的内容,在其他选择中为您的值设置属性 disabled。如果它们匹配,则它们将被禁用。但是,如果他们不这样做,那么您将再次删除 disabled 属性,以便您可以在您的选择之间保持交替。

例子:

$(document).ready(function () {
    $(".chosen-select").change(function () {
        var value = $(this);
        var prevVal = value.data("prev");
        var otherSelects = $(".chosen-select").not(this);
        otherSelects.find('option[value="' + $(this).val() + '"]').attr('disabled', true);
        if (prevVal) {
            otherSelects.find('option[value="' + prevVal + '"]').attr('disabled', false);
        }
        value.data("prev", value.val());
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="1">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>
<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="2">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>
<select data-placeholder="Choose a Country..." class="chosen-select" tabindex="3">
  <option value=""></option>
  <option value="United States">United States</option>
  <option value="United Kingdom">United Kingdom</option>
  <option value="Afghanistan">Afghanistan</option>
  <option value="Aland Islands">Aland Islands</option>
  <option value="Albania">Albania</option>
  <option value="Algeria">Algeria</option>
</select>

【讨论】:

  • 我正在使用选择的选择,我不喜欢在所有其他下拉菜单中禁用选择的字段的任何解决方案,不幸的是你的代码也不支持选择的选择。
  • 你不能把它作为普通的JS包含在你的相关文档中吗?它是否被您的 chosen-select 库覆盖?
  • 不,它不能因为选择的选择结构与普通选择不同
    美国
    • 美国
  • 您应该将相关结构添加到您的问题中,因为它与正确的解决方案高度相关。人们将使用他们从当前问题的代码中获得的任何角度。您仍然可以使用与我在此答案中相同的方法,您只需对其进行一些更改以适应逻辑,方法是相同的。您基本上正在这样做的那一刻:xyproblem.info。人们会为您的问题中提出的当前选择提供解决方案,但这实际上并不是您最终需要的,因此请添加相关代码。
  • 选择运行时创建这个结构。我们仅使用此代码
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多