使用 Chosen 具有相同值的多个选择框

Multiple selectbox's with same values using Chosen

有没有一种方法可以使用 Chosen plugin or Select2 创建多个具有相同值的选择框。

条件:

  1. 所有的选择框应该有相同的值
  2. 每个选择框Select
  3. 不能在所有选择框中选择两次选项(例如: A,B,C..为选项,其中A只能选一次)
  4. 在选择框中添加自定义值的选项,已更新为 所有选择框的
  5. Selected 值在选择框的其余部分被禁用

所以,这里有几个问题,我将对所有问题分别给出一个答案。请注意,我是 Select2 的维护者,所以 我所有的回答都是针对 Select2 的。 有些人会申请选择,但我不能保证。

完整的代码可以在这个答案的底部找到,作为一个完整的可运行的堆栈片段。个别片段将在可用时包含在问题下方。

  1. All the selectbox's should have same values

这是您在没有 Select2 或 Chosen 的情况下应该能够做到的事情,因为这完全是将一个 <select> 的内容克隆到其余内容的问题。这可以像

一样简单
$("select").html($(".main-select").html());

这将确保所有 <select> 框都具有与 main-select 的 class 相同的选项。

  1. Single Select for each selectbox

Select2 和 Chosen 都会根据您是否在 <select> 上指定 multiple 属性来确定是否允许多个 selection。所以这里的简单解决方案是永远不要包含它,所有 select 框将只允许一个 selection.

  1. Options cannot be selected twice in all of the selectbox's (eg: A,B,C.. are options, where A can be selected only once)

这个比较难,实现将完全取决于每个插件如何动态处理禁用选项。当 <select> 的值发生变化时,这两个插件都会触发 change 事件,因此您可以检测何时 selected 了新选项并在其他 <select> 框中禁用它.这两个插件通过检查 <option> 上的 disabled 属性 来确定一个选项是否可以 selected,就像浏览器一样,所以你会想要使用它。

这里的技巧是检测新 selected 选项的 value 并禁用其他 <select> 框中具有相同值的所有其他 <option> 元素.

$select2.find("option:not(:selected)").filter(function () {
  return this.value == val;
}).prop("disabled", true);

请注意,由于 Select2 中的当前错误,您需要对这些 <option> 元素调用 removeData("data") 以清除该元素的缓存数据。

  1. Option to add custom values in the selectbox, which is updated to all selectbox's

Select2 允许您在初始化 Select2 时通过设置 tags: true 启用自定义值。 Chosen 无法添加自定义值,因此这可能会破坏交易。

  1. Selected values are disabled in rest of the selectbox's

这个在解决3的时候就解决了


var $select2 = $(".select2");

// Copy the options to all selects based on the first one
$("select").html($select2.first().html());

// Initialize Select2
$select2.select2({
  allowClear: true,
  placeholder: "Select an option",
  tags: true
});

// Handle disabling already-selected options
$select2.on("change", function () {
  $select2.find("option:disabled").prop("disabled", false).removeData("data");
  
  $select2.each(function () {
    var val = $(this).val();
    
    $select2.find("option:not(:selected)").filter(function () {
      return this.value == val;
    }).prop("disabled", true).removeData("data");
  });
});
body { margin: 0; }
.select2 { width: 200px; }
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.js"></script>

<select class="select2">
  <option></option>
  <option value="AL">Alabama</option>
  <option value="AK">Alaska</option>
  <option value="AZ">Arizona</option>
</select>

<select class="select2"></select>
<select class="select2"></select>
<select class="select2"></select>