Jquery不允许来自多个选择列表的相同值

Jquery disallow same value from multiple select lists

本文关键字:列表 选择 不允许 Jquery      更新时间:2023-09-26

我需要确保在其中一个列表中选择值时,不能在其他任何列表中选择该值。这可以用jQuery完成吗?或者我需要创建一个不允许选择相同值的验证器吗?

我有多个选择列表,这些列表基本上只是数字,即

  <select id="101_1">
  <option value="0">0</option>
  <option value="1"> 1</option>
  <option value="2"> 2</option>
  <option value="3"> 3</option>
  <option value="4"> 4</option>
  <option value="5"> 5</option>
  <option value="6"> 6</option>
  <option value="7"> 7</option>
  ....
  <option value="50"> 50</option>
 </select>
 <select id="101_2">
 <option value="0">0</option>
 <option value="1"> 1</option>
 <option value="2"> 2</option>
 <option value="3"> 3</option>
 <option value="4"> 4</option>
 <option value="5"> 5</option>
 <option value="6"> 6</option>
 <option value="7"> 7</option>
  ....
  <option value="50"> 50</option>
 </select>
 <select id="101_1">
  <option value="0">0</option>
  <option value="1"> 1</option>
  <option value="2"> 2</option>
  <option value="3"> 3</option>
  <option value="4"> 4</option>
  <option value="5"> 5</option>
  <option value="6"> 6</option>
  <option value="7"> 7</option>
  ....
  <option value="50"> 50</option>
 </select>

我得到了以下代码来为我的一位同事工作:

HTML:

<h3>List 1</h3>
<select id="select1">
  <option value="null">-- select --</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="E">E</option>
</select>
<h3>List 2</h3>
<select id="select2">
  <option value="null">-- select --</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="E">E</option>
</select>
<h3>List 3</h3>
<select id="select3">
  <option value="null">-- select --</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="E">E</option>
</select>

JS与jQuery:

$(document).ready(function() {
  var selectState = {
    'select1': 'null',
    'select2': 'null',
    'select3': 'null'
  };
  $('select').change(function() {
    var selectId = $(this).attr('id');
    var selectedOptionValue = $(this).val();
    // for each other select element
    $('select[id!="' + selectId + '"]').each(function(index) {
      // enable the old option
      $(this).find('option[value="' + selectState[selectId] + '"]').removeAttr('disabled');
      if (selectedOptionValue !== 'null') { // if selected a real option
        // disable the new option
        $(this).find('option[value="' + selectedOptionValue + '"]').attr('disabled', 'disabled');
      }
    });
    selectState[selectId] = selectedOptionValue; // update the new state at the end
  });
});

这里有一个CodePen

我选择隐藏选项标记,而不是按照建议删除。这是一个完整的工作html文件。我本来打算把它发布在jsfiddle上,但由于某种原因,它不起作用要非常注意.change处理程序中的复制/粘贴错误。我自己花了一些时间想知道为什么它不起作用,但这是一个复制/粘贴错误。

请注意,只有当每个select标记都有相同的选项时,此代码才有效但是,如果您稍后添加或删除选项,并且如前所述保持它们的同步,它会动态工作。

如果你需要它来处理只有一些相同选项的列表,你会被困在处理选项上的ID,然后在此基础上进行隐藏/取消隐藏,而不是索引到子项中,但基本机制是相同的。

<!DOCTYPE html>
<html>
<head>
    <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
    <style type="text/css">
        .gone {display: none;}
    </style>
    <script type="text/javascript">
        $(document).ready(function() {
            // hides the option selected in the others
            var hideValue = function(oldval, val, options, others) {
                var unhideChild = -1;
                var hideChild = -1;
                // find which child to hide in the others
                // also find the value we change from and unhide it
                for (var i=1; i<options.length; i++) {
                    var optval = $(options[i]).val();
                    console.log(optval);
                    if (optval == val) {
                        hideChild = i;
                    }
                    if (optval == oldval) {
                        unhideChild = i;
                    }
                }
                if (unhideChild == -1 && oldval != "None") {
                    console.log("uh oh");
                    return;
                }
                if (hideChild == -1 && val != "None") {
                    console.log("uh oh");
                    return;
                }
                // hide them using the passed in selectors
                for (var j=0; j<others.length; j++) {
                    if (oldval != "None") {
                        console.log("unhiding: " + others[j] + " v: " + unhideChild);
                        $($(others[j]).children()[unhideChild]).removeClass("gone");
                    }
                    if (val != "None") {
                        console.log("hiding: " + others[j] + " v: " + hideChild);
                        $($(others[j]).children()[hideChild]).addClass("gone");
                    }
                }
            }
            // we need to keep track of the old values so we can unhide them if deselected
            var val1 = "None";
            var val2 = "None";
            var val3 = "None"
            $('#101_1').change(function() {
                var opts = $('#101_1').children();
                var v = $('#101_1').val();
                hideValue(val1, v, opts, ["#101_2", "#101_3"]);
                val1 = v;
            });
            $('#101_2').change(function() {
                var opts = $('#101_2').children();
                var v = $('#101_2').val();
                hideValue(val2, v, opts, ["#101_1", "#101_3"]);
                val2 = v;
            });
            $('#101_3').change(function() {
                var opts = $('#101_3').children();
                var v = $('#101_3').val();
                hideValue(val3, v, opts, ["#101_2", "#101_1"]);
                val3 = v;
            });
        });
    </script>
</head>
<body>
    <select value="None" id="101_1">
        <option value="None">None</option>
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
    <select value="None" id="101_2">
        <option value="None">None</option>
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
    <select value="None" id="101_3">
        <option value="None">None</option>
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
</body>
</html>

此外,如果您需要不存在"None"值,请将其删除。然后只需启动select ta 101_1(已选择0)、101_2(已选择1)等。然后确保触发更改处理程序。此外,如果没有None选项,for循环需要从i=0开始。

因此,基本上将其添加到脚本的末尾,并确保vari从0而不是1开始。

$('#101_1').val('0');
$('#101_2').val('1');
$('#101_3').val('2');
$('#101_1').trigger('change');
$('#101_2').trigger('change');
$('#101_3').trigger('change');