【问题标题】:Apply a javascript library on new inserted elements在新插入的元素上应用 javascript 库
【发布时间】:2018-09-26 08:22:28
【问题描述】:

我的代码使用“Datatable”库。 在 <table> 元素上初始化数据表

jQuery_3_3_1(".subtable").DataTable({ });

如何将其应用于新生成的元素? (这不需要我重新渲染页面或为每个页面创建单独的 id 并初始化不同的表)。

编辑:我试过这个:

    jQuery_3_3_1('#readiness').on('click', 'td.details-control', function () {
        alert("potato");
        jQuery_3_3_1(".readiness_subtable").DataTable({ });
    });

但仍然被召回,Datatable 输出此错误消息:

DataTables 警告:表 id=readiness_subtable_0 - 无法重新初始化 DataTable。有关此错误的更多信息,请参阅http://datatables.net/tn/3

当创建多个“子表”时

【问题讨论】:

  • 所以您正在动态创建表并希望在它们上运行 DataTable 初始化?
  • @PhillipThomas 是的。
  • 你试过jQuery_3_3_1("#newTableId").DataTable({ });吗?
  • 我不想按 id 初始化它。我想设置 1 个类,所有动态生成的类都将应用相同的“数据表”。
  • @PhillipThomas 查看更新后

标签: javascript jquery events binding


【解决方案1】:

您的错误来自尝试使用 new / custom 选项重新初始化数据表。确保您只初始化表一次或不更改传递给 .DataTable() 的选项,请参阅此示例:

let tableData = `<table class="tablesToMakeAwesome">
    <thead>
          <tr>
              <th>Name</th>
              <th>Position</th>
              <th>Office</th>
              <th>Age</th>
              <th>Start date</th>
              <th>Salary</th>
          </tr>
      </thead>
      <tbody>
          <tr>
              <td>Tiger Nixon</td>
              <td>System Architect</td>
              <td>Edinburgh</td>
              <td>61</td>
              <td>2011/04/25</td>
              <td>$320,800</td>
          </tr>
          <tr>
              <td>Garrett Winters</td>
              <td>Accountant</td>
              <td>Tokyo</td>
              <td>63</td>
              <td>2011/07/25</td>
              <td>$170,750</td>
          </tr>
          <tr>
              <td>Ashton Cox</td>
              <td>Junior Technical Author</td>
              <td>San Francisco</td>
              <td>66</td>
              <td>2009/01/12</td>
              <td>$86,000</td>
          </tr>
      </tbody>
  </table>`;
$(document).ready( function () {
  $('#test').append(tableData);
  $('.tablesToMakeAwesome').DataTable();
} );

function createTableWorking() {
  $('#test').append(tableData);
  $('.tablesToMakeAwesome').DataTable();
}

function createTableBreaking() {
  $('#test').append(tableData);
  // Cannot pass custom options to already initialized tables.
  $('.tablesToMakeAwesome').DataTable({ });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<link href="//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet"/>

<button onclick="createTableWorking()">Generate Table</button>
<button onclick="createTableBreaking()">Break Tables</button>
<div id="test">
  
</div>

我建议只在创建表并在 DOM 上呈现时对其进行初始化。这将允许您为其提供特定的表选项,并防止重新初始化可能因自定义选项出错的表。类似的东西:

function createTable() {
    let tableId = (new Date()).getMilliseconds();
    $('#test').append(`
      <table id="${tableId}">
          <thead>
                <tr>
                    <th>Name</th>
                    <th>Position</th>
                    <th>Office</th>
                    <th>Age</th>
                    <th>Start date</th>
                    <th>Salary</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Tiger Nixon</td>
                    <td>System Architect</td>
                    <td>Edinburgh</td>
                    <td>61</td>
                    <td>2011/04/25</td>
                    <td>$320,800</td>
                </tr>
                <tr>
                    <td>Garrett Winters</td>
                    <td>Accountant</td>
                    <td>Tokyo</td>
                    <td>63</td>
                    <td>2011/07/25</td>
                    <td>$170,750</td>
                </tr>
                <tr>
                    <td>Ashton Cox</td>
                    <td>Junior Technical Author</td>
                    <td>San Francisco</td>
                    <td>66</td>
                    <td>2009/01/12</td>
                    <td>$86,000</td>
                </tr>
            </tbody>
        </table>`);

    $('#' + tableId).DataTable();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<link href="//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet"/>

<button onclick="createTable()">Generate Table</button>
<div id="test"></div>

【讨论】:

  • 你确定这是正确的方法吗?设置动态元素并将每个元素分配给 Datatable?为什么我不使用默认类来应用于所有动态元素?
  • 假设您一次添加一个新表,我会鼓励这种方法。您将希望在它呈现后立即对其进行初始化,而不是尝试呈现所有表,因为您必须合并逻辑以防止重新初始化已经初始化的表。如果您一次创建多个表并希望一次全部初始化它们,这也是可能的。更新答案。
  • @RickSanchez 这能回答你的问题吗?
  • 在某种程度上,是的,我写的不同,但我一直使用 id。只是在类中寻找不同的解决方案。但由于在我的情况下这不是一个好习惯,所以我按照你的建议使用了 id。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多