动态生成表中的另一行后,JQuery函数不起作用[重复]

Posted

技术标签:

【中文标题】动态生成表中的另一行后,JQuery函数不起作用[重复]【英文标题】:JQuery function not working after another row in my table is dynamically generated [duplicate] 【发布时间】:2021-08-16 01:54:56 【问题描述】:

我有一个输入表单,当单击添加按钮时,它会提交当前的数据行,然后添加新的一行输入字段以输入更多数据。当我单击添加按钮时,它会将第一个输入数据发布到数据库中并创建一个新行。但是,当我尝试提交第二行时,没有任何反应。数据没有提交,也没有添加另一行。

这是我的 jquery 点击函数

$('#addRow').click(function(e) 
        const cloneRow = $('#tableData tbody tr').first();
        e.preventDefault();
        let data = 
         project_id: $(".project_id").last().val(),
         imp_or_ann: $(".imp_or_ann").last().val(),
         category: $(".category").last().val(),
         cost: $(".cost").last().val(),
         hours: $(".hours").last().val()
    
        $.ajax(
            url: '/costs_hours',
            type: 'POST',
            data: data
        ).then(
            cloneRow.clone().appendTo('#tableData tbody').find(".cost, .hours").val(''),
            $("#next").removeAttr('disabled'),
            $("#link").attr('href', '/fundings')
        )

    )

这是我的输入表单

 <table id="tableData" class="table text-light text-center mt-3">
                    <thead>
                        <tr>
                            <th scope="col">Project ID</th>
                            <th scope="col">Implementation or Annual</th>
                            <th scope="col">Category</th>
                            <th scope="col">Costs</th>
                            <th scope="col">Hours</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>
                                <div class="input-group mb-3">
                                    <input name="project_id" type="text" class="form-control project_id">
                                </div>
                            </td>
                            <td>
                                <div class="input-group mb-3">
                                    <div class="input-group mb-3">
                                        <select name="imp_or_ann" class="form-select imp_or_ann"
                                            id="inputGroupSelect01">
                                            <option disabled selected>Choose...</option>
                                            <option>Implementation</option>
                                            <option>Annual</option>
                                        </select>
                                    </div>
                                </div>
                            </td>
                            <td>
                                <div class="input-group mb-3">
                                    <div class="input-group mb-3">
                                        <select name="category" class="form-select category" id="inputGroupSelect01">
                                            <option disabled selected>Choose...</option>
                                            <option>EMO</option>
                                            <option>Analysts</option>
                                            <option>Maintenance</option>
                                            <option>ETS</option>
                                            <option>BOT</option>
                                            <option>OtherUT</option>
                                            <option>Materials</option>
                                            <option>Non-UT Contract</option>
                                            <option>Contingency</option>
                                        </select>
                                    </div>
                                </div>
                            </td>
                            <td>
                                <div class="input-group mb-3">
                                    <input name="cost" type="text" class="cost form-control">
                                </div>
                            </td>
                            <td>
                                <div class="input-group mb-3">
                                    <input name="hours" type="text" class="hours form-control">
                                </div>
                            </td>
                            <td>
                                <button id='addRow' type="button" style="background-color: #bf5700;"
                                    class="btn btn-warning text-light"><i
                                        class="fas fa-plus-circle"></i>&nbsp;Add</button>
                            </td>
                        </tr>
                    </tbody>
                </table>

我希望按钮保留在 中,以便用户知道他们必须单击添加按钮才能添加该数据。但这目前仅适用于第一个数据输入。添加第二行时,按钮不起作用,我无法提交数据并且未创建另一行。非常感谢任何建议!

【问题讨论】:

【参考方案1】:

$('#addRow') 在 JS 代码执行时被评估一次。

当您克隆并添加新行时,您实际上是使用id="addRow" 创建了一个新的(和不同的!)元素。那个元素没有监听点击事件的处理程序。

相反,您需要使用 jquery $.on() 将侦听器置于不变的内容上,例如 #tableData

   $('#tableData').on('click', '.addRow', function(e)
      ...
   );

这样,元素listening#tableData,它会获得点击,然后检查点击是否源自与.addRow 匹配的内容。您的实际功能无需更改。

但是,您需要将添加按钮从 id="addRow" 更改为 class="addRow"(或使用名称属性或其他任何东西),这样您就不会在 DOM 中拥有多个具有相同 ID 的元素。

【讨论】:

【参考方案2】:

好吧,您为多个对象设置了相同的 ID,这是有问题的,但您真正需要的是在静态父对象上设置侦听器(我使用了 tableData)。我将您的按钮 ID 更改为一个类,因此它可以应用于所有添加按钮。

您的侦听器已设置为扫描页面以查找 button#addRow 并附加侦听器。然后创建按钮的新实例,但侦听器设置已经触发并且不知道新创建的实例。相反,将侦听器设置在静态父级上。事件是on,参数click 检测点击,button.addRow 指定监听器关注的元素。

$('#tableData').on('click', 'button.addRow', function(e) 
  const cloneRow = $('#tableData tbody tr').first();
  e.preventDefault();
  let data = 
    project_id: $(".project_id").last().val(),
    imp_or_ann: $(".imp_or_ann").last().val(),
    category: $(".category").last().val(),
    cost: $(".cost").last().val(),
    hours: $(".hours").last().val()
  
  $.ajax(
    url: '/costs_hours',
    type: 'POST',
    data: data
  ).then(
    cloneRow.clone().appendTo('#tableData tbody').find(".cost, .hours").val(''),
    $("#next").removeAttr('disabled'),
    $("#link").attr('href', '/fundings')
  )

)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="tableData" class="table text-light text-center mt-3">
  <thead>
    <tr>
      <th scope="col">Project ID</th>
      <th scope="col">Implementation or Annual</th>
      <th scope="col">Category</th>
      <th scope="col">Costs</th>
      <th scope="col">Hours</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <div class="input-group mb-3">
          <input name="project_id" type="text" class="form-control project_id">
        </div>
      </td>
      <td>
        <div class="input-group mb-3">
          <div class="input-group mb-3">
            <select name="imp_or_ann" class="form-select imp_or_ann" id="inputGroupSelect01">
              <option disabled selected>Choose...</option>
              <option>Implementation</option>
              <option>Annual</option>
            </select>
          </div>
        </div>
      </td>
      <td>
        <div class="input-group mb-3">
          <div class="input-group mb-3">
            <select name="category" class="form-select category" id="inputGroupSelect01">
              <option disabled selected>Choose...</option>
              <option>EMO</option>
              <option>Analysts</option>
              <option>Maintenance</option>
              <option>ETS</option>
              <option>BOT</option>
              <option>OtherUT</option>
              <option>Materials</option>
              <option>Non-UT Contract</option>
              <option>Contingency</option>
            </select>
          </div>
        </div>
      </td>
      <td>
        <div class="input-group mb-3">
          <input name="cost" type="text" class="cost form-control">
        </div>
      </td>
      <td>
        <div class="input-group mb-3">
          <input name="hours" type="text" class="hours form-control">
        </div>
      </td>
      <td>
        <button type="button" style="background-color: #bf5700;" class="addRow btn btn-warning text-light"><i
                                        class="fas fa-plus-circle"></i>&nbsp;Add</button>
      </td>
    </tr>
  </tbody>
</table>

【讨论】:

以上是关于动态生成表中的另一行后,JQuery函数不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery动态添加时select2不起作用

jquery函数在表的第二页上不起作用[重复]

完整功能中的ajax调用后刷新jquery mobile listview不起作用

自定义函数不起作用,但逐行起作用

使用jquery动态更改背景颜色后,背景颜色的CSS悬停选择器不起作用

函数模板在c++动态顺序表中的大作用