【问题标题】:Dropdown list after selecting value create new fields选择值后的下拉列表创建新字段
【发布时间】:2016-01-22 14:14:32
【问题描述】:

解释

我需要实现,从下拉列表中选择值后,它应该自动在下面创建新行,如图所示。

示例

如果选择选项A,它应该生成行号(在这种情况下为1),带有所选值名称的标题列和2个输入字段(日期From & Date To),在它之后如果(例如)我们选择 Option C 它应该再生成 1 个新行,只是带有新的行号(在这种情况下将是2)

代码

简单的下拉列表:

<select>
  <option value="A">Option A</option>
  <option value="B">Option B</option>
  <option value="C">Option C</option>
  <option value="D">Option D</option>
</select>

我不知道如何实现它,我尝试过使用可见性,但离我需要的还很远......

还应将选定的选项插入数据库。

更新

同一选项不能选择两次,只能添加一次。如果单击错误,还应该在行附近出现X 以删除行。

行排序:

如果我选择 C,后面的 A 和 It D 之后应该按顺序出现:

 1. C [      ]  [      ] X
 2. A [      ]  [      ] X
 3. D [      ]  [      ] X

如果我从列表中删除 A 它应该会出现:

 1. C [      ]  [      ] X
 2. D [      ]  [      ] X -- this row number should change.

【问题讨论】:

  • @James111 感谢您的建议,但我是 JavaScript/JQuery 的新手,这对我来说看起来并不那么简单。
  • 您确实需要自己尝试执行此操作,并在遇到特定部分时返回。现在,您基本上是在要求某人为您完成整个项目,而这不是我们来这里的目的。
  • 谢谢,现在您需要展示您已经尝试过的内容,并清楚地说明您尝试的解决方案哪里出错了,它们是如何出错的,他们做了什么你不想要的,他们做了什么没有按照您的意愿进行操作,并且在您的 JavaScript 控制台中产生了任何错误消息(大多数浏览器中的 F12)。
  • 那你误会了;您需要证明自己尝试解决此问题。并且,如果 - 或者当 - 您自己的解决方案不起作用然后回来并就您面临的问题提出问题。批评其他人的代码是明智的,而且您提供了有用的细节,但我们在这里帮助不是为您做您的工作。我意识到,这听起来可能没有帮助,但Stack Overflow 是为爱好者和专业人士准备的,他们都应该有能力进行尝试。如果您刚刚学习,这可能不是您学习的最佳场所。

标签: javascript jquery html


【解决方案1】:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>

<script>

    $(document).ready(function () {

        $('#select_id').change(function () {
            var szTr;
            var iRowCount = 0;

            var szSelectedText = $(this).find('option:selected').text();


            if ($("#table tbody tr:has(td:eq(1):contains('" + szSelectedText + "'))").length > 0) {
                alert("Duplicate!!!!")
                return;
            }
            else {
                iRowCount = $('#table tbody tr').length + 1;
                szTr = "<tr>"
                szTr = szTr + "<td>" + iRowCount + "</td>";
                szTr = szTr + "<td>" + $(this).find('option:selected').text() + "</td>"
                szTr = szTr + "<td><input type='text' class='date_from'></td>"
                szTr = szTr + "<td><input type='text' class='date_to'></td>"
                szTr = szTr + "<td class='delete'>Delete</td>"
                szTr = szTr + "</tr>"
                $('#table tbody').append(szTr)
            }

        });

        $('#table').on('click','.delete',function () {
            $(this).closest('tr').remove();
            $('#btnSort').trigger('click');
        });

        function sortTable(table, order) {

            tbody = table.find('tbody');

            tbody.find('tr').sort(function (a, b) {
                if (order == "asc") {
                    return $('td:eq(1)', a).text().localeCompare($('td:eq(1)', b).text());
                } else {
                    return $('td:eq(1)', b).text().localeCompare($('td:eq(1)', a).text());
                }
            }).appendTo(tbody);
        }

        $('#btnSort').click(function () {

            var iCounter = 1;

            sortTable($('#table'), "asc")

            $('#table tbody tr').each(function () {

                $(this).find('td:eq(0)').text(iCounter);

                iCounter = iCounter + 1;

            });
        });

    });
</script>
</head>
<body>

<select id="select_id">
  <option value="A">Option A</option>
  <option value="B">Option B</option>
  <option value="C">Option C</option>
  <option value="D">Option D</option>
</select>

    <table id="table" >
        <thead>
  <tr>
    <td></td>
    <td>title</td>
    <td>Date from</td>
    <td>Date to</td>
  </tr>
            </thead>
        <tbody>



        </tbody>
</table>

    <input type="button" value="Sort Table" id="btnSort"/>
</body>
</html>

【讨论】:

  • 感谢您的回答,但我可以在那里添加重复项,它应该能够并且每个值只有 1 行。另外如何删除行?类似X 按钮删除行如果选择错误。
  • 非常感谢,看起来好多了,刚刚删除行后它没有改变底行的行号,请查看我的最后一个示例。
  • 在这里检查 jsfiddle.net/v4gNL/531 ,尝试添加 B > A > C > D> A > C> B > D 并且它仍然添加重复项,如果我添加例如 1 A &gt; 2 B &gt; 3 C &gt; 4 D 并删除3 C 来自列表 4 D 应该来自 3 D(应该减少行号)
  • 几乎没问题,只是没有改变已经添加的行数。 1 A &gt; 2 B &gt; 3 C &gt; 4 D 如果我删除3 C 行,它显示1 A &gt; 2 B &gt; 4 D,但它应该是1 A &gt; 2 B &gt; 3 D
  • 现在检查 :) 或者只是取消注释我评论过的代码 b:)
【解决方案2】:

嗯,我在处理它时没有看到你的更新......但是更新了

https://jsfiddle.net/p76L4327/7/

这里是html你可以

 <body>
  <select id='options'>
    <option value="0">Select an option</option>
    <option value="1">Option A</option>
    <option value="2">Option B</option>
    <option value="3">Option C</option>
    <option value="4">Option D</option>
  </select>
  <form action="">
    <div id="action2">

    </div>
    <div id='submit'>
      <br>
      <input type="submit" value="Submit">
    </div>
  </form>
</body>

这里是插件选项测试

   $(function() {
  $.fn.optionTest = function(opts) {
    var option = $.extend({}, $.fn.optionTest.defaults, opts);


    $(this).change(function() {
            option.holderObject=$(this);

      if (option.clearOnChange) {
        $(option.actionId).empty();
      }
      var val = $(this).val();
      if ($.fn.optionTest.isArray(val)) {
        $.fn.optionTest.parseArray(val, option);
      } else {
                var label =$(this).children("option:selected").eq(0).text();
        $.fn.optionTest.parseContent(val, option, label);
      }

      $('.' + option.removeLinkOptions.class).click(function(event) {
        $.fn.optionTest.removeRow(this, option);
        event.preventDefault();

      });
      return this;
    });
  };
  $.fn.optionTest.isArray = function(val) {
    return Object.prototype.toString.call(val) === '[object Array]';
  };
  $.fn.optionTest.defaults = {
    clearOnChange: false,
    actionId: '#action',
    indexOptions: {
      class: 'row-index'
    },
    rowOptions: {
      id: 'option',
      class: 'test-css',
      tag: 'tr'
    },
    fromOptions: {
      name: 'from',
      type: 'text',
      value: 'from',
      size: 20
    },
    toOptions: {
      name: 'to',
      type: 'text',
      value: 'to',
      size: 20
    },
    removeLinkOptions: {
      class: 'removeRow',
      href: 'javascript:;'
    }
  };
  $.fn.optionTest.parseArray = function(vals, options) {
  var selectedOptions = options.holderObject.children("option:selected");
  console.log(selectedOptions.eq(0).html());
    $.each(vals, function(key, val) {
      $.fn.optionTest.parseContent(val, options,selectedOptions.eq(key).text());
    });
  };
  $.fn.optionTest.removeRow = function(elem, options) {
    var row = $(elem).parent().closest(options.rowOptions.tag);
    row.remove();
    $.fn.optionTest.updateRowIndex(options);
  };

$.fn.optionTest.updateRowIndex = function(options) {
    $("." + options.rowOptions.class).each(function(key,value) {
      var index = key+1;
      $(value).attr('rowdataid',index);
      $(value).children("."+options.indexOptions.class).html(index);
    });
  };

  $.fn.optionTest.createColumn = function(content) {
    var td = $('<td>');
    return td.append(content);
  }
  $.fn.optionTest.parseContent = function(val, options ,label) {

    var index = $('.' +    options.rowOptions.class).length+1;    


    var rowData = $.extend({}, options.rowOptions);
    var indexData = $.extend({}, options.indexOptions);

    rowData.rowDataId = index;    
    rowData.id = rowData.id + '-' + val;
    var fromData = $.extend({}, options.fromOptions);
    fromData.name = fromData.name + '-' + val;
    fromData.id = fromData.id + '-' + val;
    var toData = $.extend({}, options.toOptions);
    toData.name = toData.name + '-' + val;

    if ($('#' + rowData.id).length == 0) {
      var tag = "<" + rowData.tag + ">";
      delete rowData['tag'];
      var row = $(tag, rowData);      
      var id = $('<td>', indexData).html(index);  
      var label=$('<td>').html(label);
      var from = $.fn.optionTest.createColumn($("<input>", fromData));
      var to = $.fn.optionTest.createColumn($("<input>", toData));
      var removeRow = $.fn.optionTest.createColumn($("<a>", options.removeLinkOptions).text('remove Row'));
      row.append(id).append(label).append(from).append(to).append(removeRow);

      $(options.actionId).append(row);
    }
  };
});
//Running The Plugin 
/**
Here is the Options
{
    clearOnChange:false  , 
  actionId:'#action',
    rowOptions:{
    id:'option', 
    class:'test-css'
  },
    fromOptions:{
    name:'from',
    type:'text', 
    value:'from', 
    size:20
  }, 
  toOptions:{
    name:'to',
    type:'text', 
    value:'to', 
    size:20  
  }
};
**/
$(document).ready(function() {
  $('select').optionTest({
    actionId: '#action2',
    clearOnChange: false
  });
});

这里是插件的选项

 {
    clearOnChange: false,
    actionId: '#action',
    rowOptions: {
      id: 'option',
      class: 'test-css'
    },
    fromOptions: {
      name: 'from',
      type: 'text',
      value: 'from',
      size: 20
    },
    toOptions: {
      name: 'to',
      type: 'text',
      value: 'to',
      size: 20
    },
    removeLinkOptions: {
      class: 'removeRow',
      href: 'javascript:;'
    }
  }

你可以编辑改变一些东西..清除代码..太多的工作在它上面..但我希望你可以自己添加更多的选项和功能.. 祝你好运

【讨论】:

    【解决方案3】:

    我根据您指定的内容试了一下。这应该给你一个很好的开始。它通过根据您的选择在表单中显示某些 div 来工作。你可以在这里试试http://jsfiddle.net/v4gNL/530/

    这是 HTML

    <body>
      <select id='options'>
        <option value="0">Select an option</option>
        <option value="1">Option A</option>
        <option value="2">Option B</option>
        <option value="3">Option C</option>
        <option value="4">Option D</option>
      </select>
      <form action="">
        <div style='display:none;' id='optionA'>
          <br>1. Option A:&nbsp;
          <input type='text' class='text' name='optionAfrom' value="From" size='20' />
          <input type='text' class='text' name='optionAto' value="To" size='20' />
          <br/>
        </div>
        <div style='display:none;' id='optionB'>
          <br>2. Option B:&nbsp;
          <input type='text' class='text' name='optionBfrom' value="From" size='20' />
          <input type='text' class='text' name='optionBto' value="To" size='20' />
          <br/>
        </div>
        <div style='display:none;' id='optionC'>
          <br>3. Option C:&nbsp;
          <input type='text' class='text' name='optionCfrom' value="From" size='20' />
          <input type='text' class='text' name='optionCto' value="To" size='20' />
          <br/>
        </div>
        <div style='display:none;' id='optionD'>
          <br>4. Option D:&nbsp;
          <input type='text' class='text' name='optionDfrom' value="From" size='20' />
          <input type='text' class='text' name='optionDto' value="To" size='20' />
          <br/>
        </div>
        <div style='display:none;' id='submit'>
          <br>
          <input type="submit" value="Submit">
        </div>
      </form>
    </body>
    

    还有 Javascript

    $(document).ready(function() {
      $('#options').on('change', function() {
        if (this.value == '1') {
          $("#optionA").show();
        }
        if (this.value == '2') {
          $("#optionB").show();
        }
        if (this.value == '3') {
          $("#optionC").show();
        }
        if (this.value == '4') {
          $("#optionD").show();
        }
        if (this.value > '0') {
          $("#submit").show();
        }
      });
    });
    

    【讨论】:

    • 感谢您的回答,但它有静态顺序。 A总是第一,B总是第二,依此类推。我需要这样的东西:如果我先添加 B,我应该得到 1 个行号并在第一行,如果我选择 A,它应该与 2 个行号一起添加到第 2 行。
    【解决方案4】:
    <select id='options'>
        <option value="">Select an option</option>
        <option value="A">Option A</option>
        <option value="B">Option B</option>
        <option value="C">Option C</option>
        <option value="D">Option D</option>
    </select>
    
    <table id="table" >
      <tr>
        <td></td>
        <td>title</td>
        <td>Date from</td>
        <td>Date to</td>
      </tr>
    </table>
    
    <script>
      var row = 1;
      $('#options').change(function(){
      var val = $(this).val();
      if(val != '' )
      {
        var title = val;
        var tr = '<tr><td>'+row+'</td><td>Option'+title+'</td><td><input type="text" /></td><td><input type="text" /></td></tr>';
       $("#table").append(tr);
      row++;
      }
    });
    </script>
    

    【讨论】:

    • 感谢您的回答,但我可以在那里添加重复项,它应该能够并且每个值只有 1 行。另外如何删除行?如果选择错误,则使用 X 按钮删除行。
    【解决方案5】:

    我如何在此处添加下拉菜单

                szTr = szTr + "<td><input type='text' class='date_from'></td>"
                szTr = szTr + "<td><input type='text' class='date_to'></td>"
                szTr = szTr + "</tr>"
    

    我想在此处添加不带文本字段的下拉菜单

    【讨论】:

      猜你喜欢
      • 2013-01-14
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多