【问题标题】:Disable Drop Down Options Once Chosen In Other Dropdown在其他下拉菜单中选择后禁用下拉选项
【发布时间】:2012-10-20 09:31:11
【问题描述】:

我有 12 个下拉输入区域,一年中的每个月份都有 1 个。每个下拉菜单都可以选择相同的 24 个选项。

我需要这样做,例如,如果在一月份的下拉框中选择了选项 #4,则无法在任何其他下拉菜单中选择该选项 #4。它仍然在下拉列表中,但只是被禁用。

这将有一个 ajax 触发器来检查其他下拉菜单的值并动态更改其他下拉菜单。

我可以做一个循环来动态检查和禁用这些值,而不必做很多 if 语句吗?

【问题讨论】:

  • 您可以在不希望用户选择的选项上设置disabled 属性。

标签: javascript html ajax forms loops


【解决方案1】:

您可以使用 jQuery 在所有其他下拉列表中查找 option 元素(在我的示例中,由某个 class 指定...并且可以轻松更改为另一个选择器 - 我认为选择器 "select" 是太宽泛),然后使用.prop("disabled", true) 禁用实际的option 元素。但这比这更棘手,因为您需要跟踪先前选择的值,以便在选择不同的值时再次启用下拉菜单。这是一个希望对您有所帮助的示例:

http://jsfiddle.net/p5Arj/

$(document).ready(function () {
    $(".test").each(function () {
        var $self = $(this);
        $self.data("previous_value", $self.val());
    });

    $(".test").on("change", function () {
        var $self = $(this);
        var prev_value = $self.data("previous_value");
        var cur_value = $self.val();

        $(".test").not($self).find("option").filter(function () {
            return $(this).val() == prev_value;
        }).prop("disabled", false);

        if (cur_value != "") {
            $(".test").not($self).find("option").filter(function () {
                return $(this).val() == cur_value;
            }).prop("disabled", true);

            $self.data("previous_value", cur_value);
        }
    });
});

因此,当您选择一个下拉菜单时,这会禁用所有其他下拉菜单的相同选项,并确保当您选择另一个下拉菜单时,前一个下拉菜单会在所有其他下拉菜单中启用。例如,在第一个下拉列表中选择“3”...查看第二个下拉列表 - 看到“3”已禁用...返回第一个下拉列表并选择“1”...查看第二个下拉列表 -看到“3”再次启用,但“1”被禁用。这就是 .data 在我的代码中的用途。

当然,如果您 100% 确定所有 options 与所讨论的每个 select 相同,则可以将 value 的使用替换为 selectedIndex

【讨论】:

  • 这正是我一直在寻找的,它完美无瑕。非常感谢!
  • 我希望禁用整个下拉菜单 2,直到在 1 中选择了某些内容
【解决方案2】:

http://jsfiddle.net/Rk5e9/9/

只有大约 10 行,而且没有 ajax!

<select class="unique-value">
    <option value="-1" selected="selected">Default</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>

<select class="unique-value">
    <option value="-1" selected="selected">Default</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>

<select class="unique-value">
    <option value="-1" selected="selected">Default</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>


Script:
$(document).ready(function(){
    $('.unique-value').focus(function(){
        var val = $(this).val();
        $(this).attr('data-current-value', val); 
    });

    $('.unique-value').change(function(){
        var val = $(this).val();
        if(val != -1)
            $('.unique-value option[value=' + val + ']').attr('disabled', 'disabled'); 

        var oldval = $(this).attr('data-current-value');
        $('.unique-value option[value=' + oldval + ']').removeAttr('disabled'); 
    });        
});​

【讨论】:

    【解决方案3】:

    我认为这是最短的解决方案:

    <select class="select-value">
        <option value="1">First</option>
        <option value="2">Second</option>
        <option value="3">Third</option>
    </select>
    
    <select class="select-value">
        <option value="1">First</option>
        <option value="2">Second</option>
        <option value="3">Third</option>
    </select>
    
    <select class="select-value">
        <option value="1">First</option>
        <option value="2">Second</option>
        <option value="3">Third</option>
    </select>
    

    和jquery代码:

        $(document).on('change', '.select-attendee', function(){
            $current=$(this);
            $(".select-attendee").not($current).children("option[value='"+$current.val()+"']").attr('disabled', "disabled");
        });
    

    【讨论】:

      【解决方案4】:

      假设您每个月都有一个下拉菜单,每周都有一个选项。

      <select class="month" id="october">
        <option class="week" value="week1">Week One</option>
        <option class="week" value="week2">Week Two</option>
      </select>
      

      假设您选择了一周,然后收听该事件。

      $(".month").change(function(event) {
         // Get the week just selected.
         var selectedWeek = $(this).children(".week:selected").val();
         // Enabled all weeks before disabling the selected week.
         $("option.week").removeAttr("disabled");
         // Disable all week options matching this selection.
         $("option.week[value="+selectedWeek+"]").attr("disabled", "disabled");
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        相关资源
        最近更新 更多