【问题标题】:create dependable dropdown inside the table在表格内创建可靠的下拉列表
【发布时间】:2019-09-18 22:52:50
【问题描述】:

我正在尝试将另一个下拉列表添加到我的表中,该下拉列表从我的第一个下拉列表中是可靠的。我设法将第一个下拉列表添加到每一行,但我无法创建第二个。

在 col6 上的示例小提琴代码中,我想使用 jquery 创建新的下拉列表(就像我已经对第一个下拉列表所做的那样),但它的选项取决于第一个下拉列表中的选项。例如,如果在第一个下拉列表中,我选择一个值“aaa”,然后在第二个下拉列表中,只会显示数组“A”中的选项,依此类推。 -

https://jsfiddle.net/Lqopej93/

我尝试了一些代码,但都没有成功。

<html>
<head>
<title>Filtered CSV File</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link href="static/bootstrap.min.css" rel="stylesheet" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs/dt-1.10.18/datatables.min.css"/>
</head>
  <body>
    <h1>
      Filtered CSV FIle
    </h1>
   <br/>
   <br/>
   <div class="myButtons">
     <input type="button" value="Add new row" class="btn btn-info" id="addRow">
     <input  type="button" value="Delete rows" id="delete-row" class="btn btn-info">
   </div>
   <br/>
   <div class="table-responsive">
     <table class="dataframe my_class" id="my_id">
       <thead>
         <tr style="text-align:right;">
           <th> </th>
           <th>col1</th>
           <th>col2</th>
           <th>col3</th>
           <th>col4</th>
           <th>col5</th>
           <th>col6</th>
           <th>col7</th>
           <th>col8</th>
         </tr>
       </thead>

       <tbody>
         <tr>
           <th>1</th>
           <td>row1</td>
           <td>row1</td>
           <td>row1</td>
           <td></td>
           <td>row1</td>
           <td><select name="code">
                    <option value="a">AAA</option>
                    <option value="b">BBB</option>
                </select></td>
           <td>row1</td>
           <td>row1</td>
         </tr>
         <tr>
           <th>2</th>
           <td>row2</td>
           <td>row2</td>
           <td>row2</td>
           <td></td>
           <td>row2</td>
           <td><select name="code">
                    <option value="a">AAA</option>
                    <option value="b">BBB</option>
                </select></td>
           <td>row2</td>
           <td>row2</td>
         </tr>
         <tr>
           <th>3</th>
           <td>row3</td>
           <td>row3</td>
           <td>row3</td>
           <td></td>
           <td>row3</td>
           <td><select name="code">
                    <option value="a">AAA</option>
                    <option value="b">BBB</option>
                </select></td>
           <td>row3</td>
           <td>row3</td>
         </tr>
       </tbody>
     </table>
   </div>

  </body>
</html>
$(function(){
    var firstDDM = ['aaa','bbb','ccc','ddd'];
  var firstshortcut = ['a','b','c','d'];
  var option = "",
        select = "";
  for(var i=0; i<firstDDM.length;i++){
    option += '<option value="'+ firstshortcut[i] + '">' + firstDDM[i] + '</option>';
  }
  select = '<select class="firstDDM" type="firstDDM">' + option + '</select>';

  $("tr").each(function() {
            $(this).find("td:eq(3)").append(select);
        });
});

var A = ['A1','A2','A3'];
var B = ['B1','B2','B3'];
var C = ['C1','C2','C3'];
var D = ['D1','D2','D3'];

$("#addRow").click(function(){
        $("#my_id").each(function(){
            var tds='<tr>';
            jQuery.each($('tr:last th', this), function(){
                tds += '<th>' +'<input type="checkbox" name="record" tittle="Delete this row"></input>' + '</th>';
            });
            jQuery.each($('tr:last td', this), function(){

                if($('select',this).length){
                    tds+= '<td>' + $(this).html() + '</td>';
                }else{
                    tds+= '<td></td>';
                }
            });
            tds+= '</tr>';
            $('tbody',this).append(tds);
            $('#my_id tbody tr:last').attr("contentEditable", true);
        });

    });

 //for the columns that need to be imported with dropdowns create editable option - temporarlly 
    $(function() {
    $("tr").each(function() {
        $(this).find("td:eq(3), td:eq(4),td:eq(5)").attr("contentEditable", true);
        });
    });

    //Find and remove selected table rows
    $('#delete-row').click(function(){
        var r = confirm('Are you sure you want to delete them all?');
        $("tbody").find('input[name="record"]').each(function(){
            if($(this).is(":checked")){
                if(r == true){
                    $(this).parents("tr").remove();
                }else{
                    return false;
                }

            }
        });
    });




【问题讨论】:

    标签: javascript jquery drop-down-menu


    【解决方案1】:
    $('table').on('change', 'select', function(){
        var selVal = eval($(this).val().toUpperCase());
      option = "";
      select = "";
      for(var i=0; i<selVal.length;i++){
        option += '<option value="'+ selVal + '">' + selVal[i] + '</option>';
      }
      select = '<select class="firstDDM" type="firstDDM">' + option + '</select>';
      console.log(option);
        $(this).parent('td').nextAll('td').find('select').parent('td').empty().append(select);
    });
    

    【讨论】:

    • var A = ['A1','A2','A3']; var B = ['B1','B2','B3']; var C = ['C1','C2','C3']; var D = ['D1','D2','D3']; 我需要在第二个下拉列表中的值在这里
    • 我已经修改了你的代码。它现在使用 firstshortcut 数组从声明的变量 A B C D 动态获取 select 值。
    • 我刚刚将您的修改复制到我的小提琴中,但它不起作用。第一个下拉列表中的每一行都有值 = aaa,但在第二个中,值是 a1,b1,c1,当我更改第一个值时,第二个保持不变
    • 对不起,我又修改了代码。您只需在代码中的变量 A B C D 下方添加此更新后的代码。
    • $(this).parent('td').nextAll('td').find('select').parent('td').empty().append(select); 替换为$(this).parents('tr').children('td:eq(5)').empty().append(select); 它将仅针对td:eq(5) 选择器。
    【解决方案2】:

    您只需复制逻辑并交换 Var-Names/-Values:

    $(function(){
    
      //---YOUR CODE----
      var firstDDM = ['aaa','bbb','ccc','ddd'];
      var firstshortcut = ['a','b','c','d']; 
      var option = "",
          select = "";
          
      for(var i=0; i<firstDDM.length;i++){
      	option += '<option value="'+ firstshortcut[i] + '">' + firstDDM[i] + '</option>';
      }
      
      select = '<select class="firstDDM" type="firstDDM">' + option + '</select>';
      
      
      //---SAME CODE - DIFFRENT VAR-NAMES---
      var secondshortcut = ['a','b'];
      var secondDDM = ['AAA','BBB'];
      var option2 = "",
          select2 = "";
      
      for(var j=0; j<secondDDM.length;j++){
      	option2 += '<option value="'+ secondshortcut[j] + '">' + secondDDM[j] + '</option>';
      }
      
      select2 = '<select name="code">' + option2 + '</select>';
      
      $("tr").each(function() {
        $(this).find("td:eq(3)").append(select);
        $(this).find("td:eq(5)").append(select2);
      });
    
    })

    编辑: 进行 2 个依赖选择:

    let optsA = ['A1','A2','A3'];
    let optsB = ['B1','B2','B3'];
    let optsC = ['C1','C2','C3'];
    
    $('[name="s1"]').on('change', function () {
      let val = $(this).val();
      let opts;
      let options = [];
      if(val === 'a') {
        opts = optsA;
      } else if(val === 'b') {
        opts = optsB;
      } else {
        opts = optsC;
      }
      for(let i = 0; i < opts.length; i++) {
        options.push('<option value="' + opts[i] + '">' + opts[i] + '</option>');
      }
      $('[name="s2"]').html(options.join(''));
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
    <select name="s1">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
    </select>
    
    <select name="s2"></select>

    现在你可以自己把这两件事放在一起了:)

    【讨论】:

    • 第二个下拉列表依赖于从第一个下拉列表中获取的值。如果用户在第二个中选择值“bbb”,则只会显示数组“B”中的值,依此类推
    • 感谢您的回答,但我会接受@Asfan Shaikh 的回答,因为我的第一个下拉菜单中有 11 个选项,而且会更快。但谢谢我实际上是在尝试像你写的那样写代码,但我错过了一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多