【问题标题】:Prevent option from being disabled in the current selector防止在当前选择器中禁用选项
【发布时间】:2015-05-28 22:08:30
【问题描述】:

尝试提交我的表单时,guard[] 字段未提交,因为选择字段中的选项在提交时被禁用。

我正在使用的代码一旦选择就会禁用所有选择的选项,但我正在寻找一种方法来保持它为选择它的那个选项启用(即,如果我在第一个选择中选择“Dingo”选项,则第一个选择将启用 Dingo,而第二个和第三个选择将禁用它。)代码附在下面。

我正在寻找一种从 TagName 获取元素 ID 的方法(如我的代码注释中所见),或者在提交表单之前重新启用禁用选项的方法。

JS/JQ:

function disableGuards(selectOption)
{
    var selectedGuards = [];
    var allGuards = document.getElementsByName("guard[]");
    var editedSelect = selectOption.id;

    for (var i = 0; i < allGuards.length; i++)
    {
        selectedGuards.push(allGuards[i].value); 
    }

    for (var i = 0; i < allGuards.length; i++)
    {
        var options = allGuards[i].getElementsByTagName("option");
        for (var o = 1; o < options.length; o++)
        {
            var val = options[o].value;
            var chosen = selectedGuards.indexOf(val);
            var myvalue = allGuards[i].value;

            options[o].disabled = (chosen != -1 && val != (myvalue && "NONE") /*&& editedSelect != a way to get the elementId from TagName*/);
        }
    }

    if (document.getElementById("guard1").value == "RAND")
    {
        document.getElementById("guard2").disabled = true;
        document.getElementById("guard3").disabled = true;
    }
    else
    {
        document.getElementById("guard2").disabled = false;
        document.getElementById("guard3").disabled = ((document.getElementById("guard2").value == "NONE") ? true : false);
    }
}

HTML:

<select name='guard[]' style='width:100%' id='guard1' onChange='disableGuards(this)'>
<option selected disabled>1st Choice...</option>
<option value='RAND'>No Preferences, Please Assign an Instructor</option>
<option value='Dingo'>Dingo</option>
<option value='Mike'>Mike</option>
<option value='Stephanie'>Stephanie</option>
<option value='Zach'>Zach</option>
</select>
<br>
<select name='guard[]' style='width:100%' id='guard2' onChange='disableGuards(this)'>
<option selected disabled>2nd Choice...</option>
<option value='NONE'>No 2nd Preference</option>
<option value='Dingo'>Dingo</option>
<option value='Mike'>Mike</option>
<option value='Stephanie'>Stephanie</option>
<option value='Zach'>Zach</option>
</select>
<br>
<select name='guard[]' style='width:100%' id='guard3' onChange='disableGuards(this)'>
<option selected disabled>3rd Choice...</option>
<option value='NONE'>No 3rd Preference</option>
<option value='Dingo'>Dingo</option>
<option value='Mike'>Mike</option>
<option value='Stephanie'>Stephanie</option>
<option value='Zach'>Zach</option>
</select>

【问题讨论】:

  • 您可以使第二个和第三个选择成为动态的,因此一旦做出第一个选择,它就会用左边的选项填充第二个选择,然后用剩下的选项填充第三个选择。那是你要的吗?如果他们第一次选择 Mike,那么第二个和第三个选项不应该是 Mike
  • 您是否尝试过为此使用 jQuery 的 .submit() 事件?将其绑定到您的表单并启用事件函数内的选择
  • @EasyBB 它现在的工作方式,如果我从任何字段中选择任何内容,它将在其他字段中禁用。因此,如果我从第二个字段中选择“Zach”,它将在第一个和第三个字段中禁用它。不幸的是,它还在第二个字段中禁用了它,所以我想要一种方法让它在提交时不禁用或重新启用。我正在研究 lucasnadalutti 建议的 jQuery .submit,但我无法让它正常工作。
  • 试试我的答案代码并告诉我它是否有效,因为我无法从这里测试它。

标签: javascript jquery html


【解决方案1】:

找到所有被选中的选项,然后删除禁用的关键字

原版 Javascipt

document.getElementById("#testform").addEventListener("submit",function (e) {
    var options = e.querySelector("option:checked"), option, i;
    for(i = 0; option = options[i]; i++) {
        option.removeAttribute("disabled");
    }
}, false);

jQuery

$("#testform").submit(function () {
    $('option:selected', this).removeProp("disabled");
});

【讨论】:

    【解决方案2】:

    以下代码应该可以工作:

    $(document).ready(function() {
      $('#your-form-id').submit(function() {
        $(this).find('option:disabled').prop('disabled', false);
        return true;
      });
    });
    

    Working fiddle here.

    【讨论】:

    • 这很奇怪。我会把你的代码放在一个小提琴中,看看我能不能找出原因。
    • 感谢您的帮助@lucasnadalutti :)
    • 不客气。您的代码实际上适用于我在此小提琴中添加的内容:jsfiddle.net/dttmb4hx(请注意,我在小提琴代码中将 return true 更改为 false 以防止表单提交,因此您可以看到选项已重新启用)。
    • 是的,这很奇怪。一定是您放置脚本的位置有问题。请参阅我的最新答案以进行最后一次尝试。 :)
    • 我知道它在 document.ready 服务中,而不是将它放在底部(我在几分钟前测试过它),而是将它移到顶部,它似乎正在工作完美。我想在 jQuery 中排序会有所不同。谢谢!!
    【解决方案3】:

    在您的循环中,您可以添加一个条件:if(selectOption !== allGuards[i]) { // disable },这将使触发处理程序的选择启用该选项。

    function disableGuards(selectOption)
    {
        var allGuards = document.getElementsByName("guard[]");
    
        for (var i = 0; i < allGuards.length; i++)
        {
            if(allGuards[i] === selectOption) {
              continue;
            }
            var options = allGuards[i].getElementsByTagName("option");
            for (var o = 1; o < options.length; o++)
            {   
                if(options[o].value === selectOption.value) {
                  options[o].disabled = true;
                }
            }
        }
    
        if (document.getElementById("guard1").value == "RAND")
        {
            document.getElementById("guard2").disabled = true;
            document.getElementById("guard3").disabled = true;
        }
        else
        {
            document.getElementById("guard2").disabled = false;
            document.getElementById("guard3").disabled = ((document.getElementById("guard2").value == "NONE") ? true : false);
        }
    }
    <select name='guard[]' style='width:100%' id='guard1' onChange='disableGuards(this)'>
    <option selected disabled>1st Choice...</option>
    <option value='RAND'>No Preferences, Please Assign an Instructor</option>
    <option value='Dingo'>Dingo</option>
    <option value='Mike'>Mike</option>
    <option value='Stephanie'>Stephanie</option>
    <option value='Zach'>Zach</option>
    </select>
    <br>
    <select name='guard[]' style='width:100%' id='guard2' onChange='disableGuards(this)'>
    <option selected disabled>2nd Choice...</option>
    <option value='NONE'>No 2nd Preference</option>
    <option value='Dingo'>Dingo</option>
    <option value='Mike'>Mike</option>
    <option value='Stephanie'>Stephanie</option>
    <option value='Zach'>Zach</option>
    </select>
    <br>
    <select name='guard[]' style='width:100%' id='guard3' onChange='disableGuards(this)'>
    <option selected disabled>3rd Choice...</option>
    <option value='NONE'>No 3rd Preference</option>
    <option value='Dingo'>Dingo</option>
    <option value='Mike'>Mike</option>
    <option value='Stephanie'>Stephanie</option>
    <option value='Zach'>Zach</option>
    </select>

    【讨论】:

    • 这已经到了某个地方。现在,当我提交时,最后一个值将被传递,但其他两个将被丢弃。例如:如果我按顺序选择 Mark、Stephanie 和 Zach(分别在滑块 1、2 和 3 中),则“Zach”将作为数组值 0 提交,而其他两个在被禁用时被丢弃。
    • 啊。我知道了。我会再仔细看看。
    • 已更新。那个工作?德拉特。我现在看到,如果您选择其他选项,这些选项不会重新启用。嗯。
    • 感谢您提供的所有帮助。即使你不明白,我也非常感谢像你和@lucasnadalutti 这样的人
    • @humble.rumble 的回答可能是最简单的解决方案。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多