【问题标题】:not allow select same value with two dropdown不允许使用两个下拉菜单选择相同的值
【发布时间】:2011-03-02 13:34:54
【问题描述】:

我想防止用户在这个表单中两次选择相同的值

<select name="indication_subject[]">
  <option value="" selected="selected">a </option>
  <option> Accounting</option>
  <option> Afrikaans</option>
  <option> Applied Information and Communication Technology</option>
  <option> Arabic</option>
  <option> Art and Design</option>
  <option> Biology</option>
  <option> Business Studies</option>
</select>

<select name="indication_subject[]">
  <option value="" selected="selected">a </option>
  <option> Accounting</option>
  <option> Afrikaans</option>
  <option> Applied Information and Communication Technology</option>
  <option> Arabic</option>
  <option> Art and Design</option>
  <option> Biology</option>
  <option> Business Studies</option>
</select>

【问题讨论】:

  • 你可以使用jquery还是必须是纯javascript?你有两个选择,不仅具有相同的选项而且具有相同的名称
  • 使用一些名为"indication_subject[accounting]""indication_subject[afrikaans]" 等的复选框来代替两个选择框怎么样?这将允许用户选择可变数量的不同项目。当然,如果您希望用户恰好选择两个项目,这将无济于事。
  • @ThiefMaster 对多个表单项使用相同的名称,您会在请求 url 中获得 ?myname=val1&amp;myname=val2&amp;myname=val3,通常会转换为 array(val1, val2, val3)
  • 我同意 ThiefMaster 和 redShadow 的观点。您让自己很难为 2 个选择使用相同的名称...
  • @redShadow:我知道。但是你通常也不会使用相同的值。

标签: javascript validation forms


【解决方案1】:

我不确定你是如何选择元素的,所以为了简单起见,我会给它们一个 ID。

示例: http://jsfiddle.net/x4E5Q/1/

function preventDupes( select, index ) {
    var options = select.options,
        len = options.length;
    while( len-- ) {
        options[ len ].disabled = false;
    }
    select.options[ index ].disabled = true;
    if( index === select.selectedIndex ) {
        alert('You\'ve already selected the item "' + select.options[index].text + '".\n\nPlease choose another.');
        this.selectedIndex = 0;
    }
}

var select1 = select = document.getElementById( 'select1' );
var select2 = select = document.getElementById( 'select2' );

select1.onchange = function() {
    preventDupes.call(this, select2, this.selectedIndex );
};

select2.onchange = function() {
    preventDupes.call(this, select1, this.selectedIndex );
};

html

<select id="select1" name="indication_subject[]">
  <option value="" selected="selected">a </option>
  <option> Accounting</option>
  <option> Afrikaans</option>
  <!-- ...and so on... -->

<select id="select2" name="indication_subject[]">
  <option value="" selected="selected">a </option>
  <option> Accounting</option>
  <option> Afrikaans</option>
  <!-- ...and so on... -->

编辑: 更改为处理不支持.disabled 的浏览器。感谢@Zoidberg

【讨论】:

  • dw 没有问题,我想确保你的答案是完整的,因为它比我的要优雅得多,并且可能会被接受:)
【解决方案2】:

最终,如果您负担得起房地产,我会改用单选按钮或复选框,并且最多只允许他们选择 2 个复选框。对我来说,下拉菜单在这种情况下不起作用

但是,如果您没有房地产并且必须使用下拉菜单,那么您最好的选择是,一旦他们在第一个下拉菜单中选择了一个值,在第二个下拉菜单中禁用或删除它,反之亦然反之亦然(如果他们在第一个中选择一个值)。我建议禁用而不是删除,因为用户会更清楚发生了什么。

<select id="subject1" onchange="updateSelect(this,'subject2');" name="indication_subject[]">
  <option value="" selected="selected">a </option>
  <option value="1"> Accounting</option>
  <option value="2"> Afrikaans</option>
  <option value="3"> Applied Information and Communication Technology</option>
  <option value="4"> Arabic</option>
  <option value="5"> Art and Design</option>
  <option value="6"> Biology</option>
  <option value="7"> Business Studies</option>
</select>

<select id="subject2" name="indication_subject[]" onchange="updateSelect(this,'subject1');" >
  <option value="" selected="selected">a </option>
  <option value="1"> Accounting</option>
  <option value="2"> Afrikaans</option>
  <option value="3"> Applied Information and Communication Technology</option>
  <option value="4"> Arabic</option>
  <option value="5"> Art and Design</option>
  <option value="6"> Biology</option>
  <option value="7"> Business Studies</option>
</select>

然后是与之配套的js

function updateSelect(changedSelect, selectId) {
   var otherSelect = document.getElementById(selectId);
   for (var i = 0; i < otherSelect.options.length; ++i) {
       otherSelect.options[i].disabled = false;
   }
   if (changedSelect.selectedIndex == 0) {
      return;
   }
   otherSelect.options[changedSelect.selectedIndex].disabled = true;
}

唯一的问题是,IE 7 和更早的版本不支持禁用。如果这是一个交易破坏者,那么您将不得不从“其他选择”中删除该选项,然后再将其替换。唯一的问题是它会改变选项的顺序,除非你刷新整个列表。要刷新整个列表,您需要将选项和值存储在一个永远不会更改的数组(有点像模型)中,并用于在更改事件发生时更新选择。

【讨论】:

    【解决方案3】:

    试试这个,在选择 1 中添加 id="indication_subject1"。 和 id="indication_subject2" 在选择 2 中。

    Javascript:

    $('#indication_subject1').change(function(){
        var indication_subject1 = $('#indication_subject1').val();
        var indication_subject2 = $('#indication_subject2').val();
    
        if (indication_subject1 == indication_subject1)
            {
                $('#indication_subject2').prop('selectedIndex',0);// val = "" selected, or you can add alert('Can't select same value!')
    
            }
    });
    
    $('#indication_subject2').change(function(){
        var indication_subject1 = $('#indication_subject1').val();
        var indication_subject2 = $('#indication_subject2').val();
    
        if (indication_subject2 == indication_subject1)
        {
            $('#indication_subject1').prop('selectedIndex',0);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2014-10-21
      • 2021-05-13
      • 1970-01-01
      相关资源
      最近更新 更多