Jquery选择器获取所有下拉值,2个下拉列表的问题

时间:2017-04-03 19:38:50

标签: javascript jquery html drop-down-menu dropdown

HTML表格

  

第1行:第1列 [Country DropDown] | Col#2 [StateDropDown]

     

第2行:第1列 [Country DropDown] | 第2栏 [StateDropDown]

表格有2 dropdownlistsCountry& State - 这适用于一个下拉列表,但它也会禁用其他/州下拉列表!

问题是,虽然两者美国和Aust都有diff states selected文字,但在col2结束时相同选择了State ID / value 3(如果我选择加利福尼亚州,珀斯也被禁用了!因此我的代码禁用它们作为重复项,因为它比较选定的值而不是文本)例如这个选择禁用了珀斯..

[USA]      ->    [California]  (value = 3)
[Australia] ->   [Perth]       (*also* has value= 3) so its disabled

如何以unique combination国家和地区的身份执行此操作每一行的状态?或者只是比较下拉菜单的文本?...

  1. 即。选项1,如何同时检查Country ID + State ID Value already exist
  2. 选项2,只需比较所选文本(感觉半烤)
  3. JS Fiddle

    // Javascript Does not disable States previously selected
    $("#CountryTable").on('change', '.State', function() {
    var dropDownText = $('#CountryTable .State select').not(this).map(function()                {
     return this.SelectedText; // does not work this.val() works but useless
    }).get();
    var selectedValue = $(this).val();
    var otherDropdowns = $('.State').not(this);
    

    otherDropdowns.find('option [value ='+ selectedValue +']')。prop('disabled',true); });

    <table id="CountryTable">
    <tbody id="CountryTableBody"> 
        <tr class="row">
            <td>
                <select>
                    <option value="1">Country A</option>
                    <option value="2">Country B</option>
                    <option value="3">Country C</option>
                </select>               
            </td>
    
            <td>
                <select>
                    <option value="1">State 1</option>
                    <option value="2">State 2</option>
                    <option value="3">State 3</option>
                    <option value="4">State 4</option>
                    <option value="5">State 5</option>
                </select>               
            </td>           
        <tr>  <!-- in JS prevent previous selection -->
        <tr class="row">
           <td>
                <select>
                    <option value="1">Country A</option>
                    <option value="2">Country B</option>
                    <option value="3">Country C</option>
                </select>               
            </td>
            <td>
                <select>
                    <option value="1">State 1</option>
                    <option value="2">State 2</option>
                    <option value="3">State 3</option>
                    <option value="4">State 4</option>
                    <option value="5">State 5</option>
                </select>               
            </td>          
        <tr>    
    </tbody>   
    

    ***图片显示类似的内容 ...不准确

    Sample to show - prevent duplicate Combinations of the Cascading drowpdowns

1 个答案:

答案 0 :(得分:2)

这不是一个完美的解决方案,你可以复制/粘贴,但它真正接近你想要的。

我用4个参数作为一个整体函数:

  1. 真实table,最好是id
  2. td,最好是class
  3. 要克隆的隐藏table,最好是id
  4. 新行button,最好是id
  5. 让您自由地在HTML中为自己想要的东西命名,而不是在修复脚本中使用这些4的MULTIPLE位置。

    现在......这只是一个好的开始。
    实际上,当用户从&#34;国家A&#34;到#B;国家B&#34;,州下拉列表应该是不同的!

    这是我离开的唯一问题...因为我不知道你想如何加载这些选项。

    我花了很多时间辞职......我这样做是因为我无法相信这样一个简单的&#34;请求可能是那么复杂......我不得不粉碎它 ;)

    所以这里是代码(仅限JS)和工作CodePen演示。

    var excusiveSelect = function(tableID,rowCLASS,dummyID,cloneBtn){   // Preferably ID, CLASS, ID, ID
    
      console.clear();
    
      // Cloning function
      var cloneRow = function(){
        var newrow = $(dummyID).find(rowCLASS).clone();
        $(tableID).append(newrow);
        refresh_mapping();
      };
    
      // Generate new lines
      $(cloneBtn).on("click",cloneRow);
    
      // ================================================================================ INITIALISATION
      // Selection mapping
      var row_count;
      var row_map = {};
    
      // Get select clas names per colums
      var col_count = $(rowCLASS).first().find("td").length;
      var col_classes = [];
      for(i=0;i<col_count;i++){
        col_classes[i] = $(document).find(rowCLASS).first().find("select").eq(i).attr("class").split(" ").join(".");
      }
      console.log("SELECT CLASSES: "+JSON.stringify(col_classes));
    
      var refresh_mapping = function(){
        row_count =  $(document).find(rowCLASS).length-1;
        console.log("ROWCOUNT: "+row_count);
        for(i=0;i<row_count;i++){
    
          row_map["row_"+i] = {};
          $(tableID).find(rowCLASS).eq(i).find("select").each(function(index){
    
            // Get the select classes as object attribute.
            var thisClasses = $(this).attr("class").split(" ").join(".");
    
            // For each row/select get the selected index.
            row_map["row_"+i][thisClasses] = $(this)[0].selectedIndex;
          });
        }
        console.log("VALUES MAPPING: "+JSON.stringify(row_map));
      }
    
      cloneRow();
    
      // ================================================================================ FROM COLUMN #1
    
      $(document).on("change","."+col_classes[0],function(){
        console.log("\n======================================================= Country change\n");
    
        refresh_mapping();
    
        // Disables options already selected in ALL col_classes[1] where col_classes[0] is the same
        for(i=0;i<row_count;i++){
    
          if( ( row_map["row_"+i][col_classes[0]] == $(this)[0].selectedIndex ) 
             && (  $(this).closest(rowCLASS).index() != i ) ){
    
            $(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq( row_map["row_"+i][col_classes[1]] ).attr("disabled",true);
    
            // Else enable the option if not self
          }else{
            if( $(this).closest(rowCLASS).index() != i ){
              $(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq(i).attr("disabled",false);
            }
          }
        }
    
      });
    
      // ================================================================================ FROM COLUMN #2
    
      $(document).on("change","."+col_classes[1],function(){
        console.log("\n======================================================= State change\n");
        console.clear();
        refresh_mapping();
    
        thisIndex = $(this)[0].selectedIndex;               // Option selectedIndex
        thisRowIndex = $(this).closest(rowCLASS).index();     // Row index
    
        // If same country...
        var thisCol0index = $(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex;
    
    
        $(tableID).find("."+col_classes[1]).each(function(){
          if( $(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex == thisCol0index ){
    
            // Zap tout les disabled
            $(this).find("option:not(:eq(0))").attr("disabled",false);
    
            // Use mapping to disable based on col_classes[0]
            for(i=0;i<row_count;i++){
              if( row_map["row_"+i][col_classes[0]] == thisCol0index ){
    
                $(this).find("option").eq(row_map["row_"+i][col_classes[1]]).attr("disabled",true);
              }
            }
    
          }
        });
      });
      // ================================================================================
    }
    
    // Init!
    excusiveSelect("#CountryTable",".row","#DummyTable","#newRow");   // Preferably ID, CLASS, ID, ID