【问题标题】:Changing one select option changes many others (JavaScript, JQuery)更改一个选择选项会更改许多其他选项(JavaScript、JQuery)
【发布时间】:2015-07-03 09:51:26
【问题描述】:

我在一个带有一长串元素的 jsp 页面上有很多选择下拉菜单。所有这些下拉列表都具有相同的元素列表。假设我必须按照用户的偏好降序获得选择。我通过以下方式进行了(许多)选择:

<select id="sel1" class="myClass">
        <script>
         populate(document.getElementById('sel1'));
        </script>
  </select>

...

<script>
function populate(op1)
{

    var myArray = ["Chinese", "Italian", "Indian", ...//a long list of elements
        var sel = op1;
        for(var i = 0; i < myArray.length; i++) {
            var opt = document.createElement('option');
            opt.innerHTML = myArray[i];
            opt.value = myArray[i];
            sel.appendChild(opt);
        }
}
</script>

我必须以这样一种方式创建 javascript/JQuery 代码:如果用户在第一次选择时选择了一个选项,则该选项在其他选项中会被禁用/删除,为以后的更改留出空间。比如说,用户的偏好顺序是:中文、印度、意大利......然后在第一个下拉菜单中选择中文时,它会从其他下拉菜单中被禁用/删除。然后,在从第二个中选择 Indian 时,它会从所有其他(包括前一个)中禁用/删除。 现在,如果用户决定他的偏好顺序实际上是中文、意大利文、印度文……他应该能够以这样的方式更改他的选择,这样代码不会被破坏。比如说,我们可以有一个重置按钮,它通过调用这个函数来重置所有的选择:

function resetFunc()
{
    var options = document.getElementsByClassName("myClass");
        for (var i = 0, l = options.length; i < l; i++) 
        {
            options[i].selectedIndex = "0";
        }
}

知道如何做到这一点吗?我需要代码独立于浏览器(在谷歌搜索时,我在某处读到 IE 不支持从下拉列表中删除元素)。

编辑:这就是我想要的:

http://jsfiddle.net/RaBuQ/1/

但是,这里有一个问题。如果用户不断改变他的选择,这件事就会崩溃。我可以选择多个选项。

【问题讨论】:

  • 请创建 plunker 或 fiddle
  • @mplungjan:不,实际上我没有。但它确实给了我一个 jsfiddle 示例,在我的情况下也不起作用。
  • 因此:$(this).find("option").prop("disabled",false); - 它也必须是有条件的
  • @mplungjan 抱歉,我没听明白。这个问题意味着运行额外的代码来检查任何选择是否相同。可以删除选择吗?因此,如果用户方面有更正,总会有重置。

标签: javascript jquery html


【解决方案1】:
$('select').change(function(){
    var v = $(this).val();
    $('select option[value="'+$(this).data('old-val')+'"]').prop('disabled', false);
    $(this).data('old-val',v);
    if(v != "0"){
        $('select option[value="'+v+'"]').not(this).prop('disabled',true);
    }
});

Here's a fiddle.

如果我选择了“足球”、“高尔夫”、“网球”,我需要先在第三个框中选择“无偏好”,然后才能在其他框中选择它。我认为从用户体验的角度来看这是可以接受的。

【讨论】:

  • 确实有效。一个简单的问题 - onclick 和 onchange 函数在这里做什么-p1(priority1)?我没听懂。
  • 比我的优雅得多(我删除了)我唯一的改进是从第一个使用克隆的选项中生成其他选择。
  • @user2816215 The original fiddle 具有这些 onclick/change 功能。我在示例中删除了它们,但只是没有删除标签。随意删除:)。我没有包括生成select 的'因为我认为你有那个位 - 你只是在寻找一种方法来启用/禁用'已经选择的'选项。对吗?
  • 哦,对,是的。此外,它工作得很好。谢谢!
  • @DaveSalomon 是的,会的。还有一件事 - 我把它们放在一起 - 似乎有一个问题:这里:jsfiddle.net/ignite9/m4szprxh/14
【解决方案2】:

既然你已经标记了这个 jQuery,我下面的示例将使用它:

function populate() {
  var myArray = ["Chinese", "Italian", "Indian"];
  $('.myClass').each(function() {
    var dis = $(this);
    dis.append($("<option>").attr("value", "").text("select"));
    $.each(myArray, function(i, o) {
      dis.append($("<option>").attr("value", o).text(o));
    });
  });
}

function init() {
  $('.myClass').html('').prop('disabled', false);
  populate();
}

$(document).on('change', '.myClass', function() {
  $('.myClass option[value="' + $(this).val() + '"]:not(:checked)').remove();
  $(this).prop('disabled', true);
});

$('#reset').click(init);

init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="sel1" class="myClass"></select>
<select id="sel2" class="myClass"></select>
<select id="sel3" class="myClass"></select>
<input type="button" id="reset" value="Reset options" />

【讨论】:

  • 好的,我正在尝试这个。一个问题 - 如果我在一个选择中选择多次,这些选择会被删除,然后我无法在另一个选择中选择相同的选择。一旦在这种情况下做出选择,难道不应该禁用整个选择吗?否则,这些选择不能在另一个选择中。例如,如果我在第一个框中更改了 3 次选择,那么接下来的两个就没有选择了。
  • @user2816215 这将是一个问题。它当然可以修复,但我现在正在开车,可能不建议解决代码问题。稍后我会添加一些东西
  • @user2816215 好的,回到计算机上并为上述问题添加了快速修复。一旦选择,这会将整个元素设置为“禁用”,因为我没有看到任何理由与 Dave 执行相同的解决方案。如果您更喜欢禁用options,您可以随时混合和匹配解决方案
  • 是的,现在可以使用。现在的问题是选择哪一个作为解决方案。你的两个答案都有效。理想情况下,您的答案是根据我的要求,但我最终更喜欢另一个答案。为您的代码 +1。谢谢。 :)
  • 很好@user2816215 - 选择答案完全取决于您,Dave 的解决方案很好。您仍然可以使用我的示例中的位,因为它可能更完整一些。很高兴能提供帮助!
【解决方案3】:

以下可能不是最有效的解决方案,但如果没有更好的解决方案,您应该尝试一下:当您更改一个选择时,清空所有其他选择,然后用所有其他选项填充它们。

假设您有 3 个选择:sel1、sel2、sel3 在 onchange 事件中,您可以调用函数“fill_other_sel(number)”,其中 number 是当前选择器的编号。

此函数应删除当前选项,然后使用以前的选择器填充检查,这样您就不会填充以前选择的值。

function fill_other_sel(number){
   var num_selectors = 3;
   while (number <= num_selectors){
      number++;
      $('#sel'+number).options.length=1;
      populate('sel'+number, already_selected_values_array);
   }

}

您也可以在填充函数中添加一个参数,显示哪些值已被选中,以防止它们再次出现

【讨论】:

  • 这有点低效。这意味着在可能有更简单的解决方案时运行大量代码。
  • 我知道,这就是为什么我说“可能不是最有效的解决方案,但如果没有更好的解决方案,你应该尝试一下”:)
  • 我的意思是添加“就像你说的那样”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2021-08-24
相关资源
最近更新 更多