【问题标题】:Add Row dynamically with SelectPicker使用 SelectPicker 动态添加行
【发布时间】:2021-08-22 02:05:23
【问题描述】:

早上,

我在第一列有一个带有 selectpicker 的表。 我想动态添加行。 实际上,在添加第一列之后就可以了,但我无法选择第二列。 感谢您的帮助。

我的桌子:

<tbody>
    <tr>
        <td>
            <Select class="selectpicker" name="item_desc[]" id="item_desc" type="integer" onchange="select_fields(this)">
                <option> </option>
                @foreach ($articles as $article)
                    <option>{{$article->id}}</option>
                @endforeach
            </Select>
        </td>
        <td class="writefields" name="item_fields[]"></td>
        <td><i class="btn far fa-trash-alt" onclick="remove_row(this)"></i></td>
    </tr>
</tbody>

`

我添加行的功能:

function add_row(){
     var root = document.getElementById('add_table').getElementsByTagName('tbody')[0];
     var rows = root.getElementsByTagName('tr');
     var clone = cloneEl(rows[rows.length -1]);
     cleanUpInputs(clone);
     root.appendChild(clone);
 }

 function cloneEl(el){
     var clo = el.cloneNode(true);
     return clo;
 }

 function cleanUpInputs(obj){
     for (var i = 0; n = obj.childNodes[i]; ++i){
         if(n.childNodes && n.tagName != 'INPUT'){
             cleanUpInputs(n);
         }else if (n.tagName == 'INPUT' && n.type == 'text') {
             n.value = '';
         }
     }
 }

我的 select_fields 函数:

function select_familyfields(e)
{
    ...
    var selectionfamille = e.value;

  $.ajax({
            type: "POST",
            url: "/achats/selection",
            data: {_token: CSRF_TOKEN, code_item : selection },
            dataType: "JSON",
            success: function (data) {       $(e).parents('tr').find('.item_fields[]').text(data.natureachat.LibNatureAchat); 
          ...
        }
    });
}

【问题讨论】:

  • 你能说得更具体些吗?新创建的行上的选择菜单是否没有触发 onchange 事件? select_fields() 函数在哪里?
  • 感谢您的反馈。请参阅下面我的 select_fields() 函数。
  • 我认为我的问题是在通过克隆将新行添加到添加行功能后删除引导选择。我可以成功选择第一行。但我不能在添加新行后做出新的选择。我的新克隆 ligne 仍然选择了第一行项目。
  • 你解决了吗?
  • 还没有...正在寻找解决方案!

标签: javascript php jquery laravel bootstrap-select


【解决方案1】:

可能是因为您的 &lt;Select 元素有一个 ID,而您需要使其唯一?尝试将此添加到您的 cleanUpInputs 函数中

function cleanUpInputs(obj){
     let cloneCounter = document.getElementById('add_table').getElementsByTagName('tbody').length + 1
     obj.getElementsByClassName('.selectpicker')[0].id = "item_desc" + cloneCounter;
     for (var i = 0; n = obj.childNodes[i]; ++i){

【讨论】:

  • 经过测试我有这个错误:“obj.querySelector 不是一个函数”
  • 我更新了我的答案,你可以试试吗?谢谢
  • 测试后出错:“obj.getElementsByClassName(...)[0] 未定义”
【解决方案2】:

您在代码中使用了 selectpicker,因此该插件会创建自己的动态 html 并将 ids ,data-attribute 分配给它们,因此当您 clone 您的 tr 时它们也会被复制,这就是您看不到的原因新添加的下拉列表中的选项也无法选择。

相反,实现这项工作的一种方法是将 clone tr 存储在 selectpicker 尚未初始化的某个变量中。然后,每当调用 add_row() 函数时,只需使用克隆的 tr 附加到您的 tbody 中,然后使用 $("#add_table tbody tr:last select").selectpicker() 初始化您的选择器。

演示代码

var cloned = $("#add_table tbody tr:first").clone() //keep clone for later use..
$("select[name*=item_desc]").selectpicker() //intialize your slectpicker
function add_row() {
  $(cloned).find("input").val("") //empty any input..
  $(cloned).find(".writefields").text("") //clear td 
  $("<tr>" + $(cloned).html() + "</tr>").appendTo($("#add_table tbody")) //append to your tbody..
  $("#add_table tbody tr:last select").selectpicker() //intialize newly added selct...
}

function select_fields(e) {
  var selectionfamille = e.value;
  console.log(selectionfamille)

  /* $.ajax({
     type: "POST",
     url: "/achats/selection",
     data: {
       _token: CSRF_TOKEN,
       code_item: selection
     },
     dataType: "JSON",
     success: function(data) {*/
  //just for demo...
  $(e).parents('tr').find('[name="item_fields[]"]').text("abcxyz") //data.natureachat.LibNatureAchat;

  /*}
  });*/
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/css/bootstrap-select.min.css">
<script src="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/js/bootstrap-select.min.js"></script>

<table id="add_table">
  <tbody>
    <tr>
      <td>
        <!--remove selectpicker class and id..-->
        <select name="item_desc[]" onchange="select_fields(this)">
          <option> </option>

          <option>1</option>
          <option>2</option>
        </select>
      </td>
      <td class="writefields" name="item_fields[]">Smethings...</td>
      <td><i class="btn far fa-trash-alt" onclick="remove_row(this)">Delete</i></td>
    </tr>
  </tbody>
</table>
<button onclick="add_row()">Add</button>

【讨论】:

  • 感谢斯瓦蒂的帮助。成功了!
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多