【问题标题】:Dynamically adding content to table using Vanilla JS使用 Vanilla JS 向表格动态添加内容
【发布时间】:2019-06-29 18:51:50
【问题描述】:

我正在尝试将与数据库中的用户一样多的行添加到表中。我通过 ajax 请求从后端获取用户信息,然后当响应 (JSON) 到达时,我的代码将其传递给我使用 underscore.js 创建的愚蠢模板。

在下划线渲染模板后,这是我得到的:

<tr data-id="29">
    <td>email@themail.ma</td>

    <td>
        <ul style="display:inline-block; padding-left:0; margin-bottom:0">
            <li style="display:inline-block;"><a href="#"></a></li>
        </ul>
    </td>

    <td>Activo</td>

    <td>No caduca</td>

    <td>
        <span data-placement="left" data-toggle="tooltip" title="Eliminar usuario">
            <a class="icon-trash" href="#" role="button"
               data-toggle="modal"
               data-target="#js-confirm-modal"
               data-action="js-del-user"
               data-msg="Desea eliminar el usuario?"></a>
        </span>

        <span data-placement="left" data-toggle="tooltip" title="Cambiar contraseña">
            <a class="icon-key" href="#" role="button"
               data-toggle="modal"
               data-target="#js-confirm-modal"
               data-action="js-chg-pass"
               data-msg="Cambiar contraseña del usuario?"></a>
        </span>

        <span data-placement="left" data-toggle="tooltip" title="Bloquear usuario">
            <a class="icon-lock" href="#" role="button"
               data-toggle="modal"
               data-target="#js-confirm-modal"
               data-action="js-block-user"
               data-msg="Desea bloquear el usuario?"></a>
        </span>

        <span data-placement="left" data-toggle="tooltip" title="Desbloquear usuario">
            <a class="icon-lock-open" href="#" role="button"
               data-toggle="modal"
               data-target="#js-confirm-modal"
               data-action="js-unblock-user"
               data-msg="Desea desbloquear el usuario?"></a>
        </span>

    </td>
</tr>

到目前为止一切都很好,但是当我做这样的事情时:

tbody.innerHTML = html;

// or 

let parseHTML = function(str) {
  var tmp = document.implementation.createHTMLDocument();
  tmp.body.innerHTML = str;
  return tmp.body.children;
};

parseHTML(html);  // and then adding the returned codes to my tbody

它只是失去了 html 表格格式(td、tr 标签等)

【问题讨论】:

    标签: javascript html underscore.js html-parsing


    【解决方案1】:

    我在这里看到的问题是您使用tbody.innerHTML = html; 而不是tbody.innerHTML += html;,当您使用+= 运算符时,您会保留旧的HTML,如果您使用=,则将旧的HTML 替换为新的HTML

    【讨论】:

    • 我认为使用 tbody.appendChild(html) 比使用 += 更好
    【解决方案2】:

    我经常为此使用模板文字,使用+= 运算符构造一个长的HTML 字符串,然后使用document.innerHTML 将最终的HTML 字符串附加到我的页面。

    一个简单的例子可能如下所示:

    const helloWorlds = {
      spanish: '¡Hola Mundo!',
      polish: 'Witaj świecie!',
      french: 'Bonjour le monde!'
    }
    
    const helloWorldsKeys = Object.keys(helloWorlds);
    
    let listMarkup = '';
    
    for (let i = 0; i < helloWorldsKeys.length; i++) {
      listMarkup += '<li class="listItem">' + helloWorlds[helloWorldsKeys[i]] + '</li>';
    }
    
    const myList = document.getElementById("list");
    
    myList.innerHTML = listMarkup;
    <div>
      <h1>Hello World!</h1>
      <ul id="list"></ul>
    </div>

    当然,你也可以在客户端使用appendChild逐位构造列表,而不是一次性添加整个列表。这可能看起来像:

    const myList = document.getElementById("list");
    
    const helloWorlds = {
      spanish: '¡Hola Mundo!',
      polish: 'Witaj świecie!',
      french: 'Bonjour le monde!'
    }
    
    const helloWorldsKeys = Object.keys(helloWorlds);
    
    for (let i = 0; i < helloWorldsKeys.length; i++) {
      let listItem = document.createElement('li');
      listItem.classList.add('listItem');
      listItem.innerHTML = helloWorlds[helloWorldsKeys[i]];
      myList.appendChild(listItem);
      
    }
    <div>
      <h1>Hello World!</h1>
      <ul id="list"></ul>
    </div>

    这是一个使用表格的示例:

    const myTableBody = document.getElementById("my-table-body");
    
    const helloWorlds = {
      spanish: '¡Hola Mundo!',
      polish: 'Witaj świecie!',
      french: 'Bonjour le monde!'
    }
    
    const helloWorldsKeys = Object.keys(helloWorlds);
    
    for (let i = 0; i < helloWorldsKeys.length; i++) {
    
      // create a table row element
      let tableRow = document.createElement('tr');
    
      // create a table cell (td) element
      let listItem = document.createElement('td');
      listItem.classList.add('listItem');
    
      // add content to table cell element
      listItem.innerHTML = helloWorlds[helloWorldsKeys[i]];
    
      // append table cell to table row
      tableRow.appendChild(listItem);
    
      // append table row to table body
      myTableBody.appendChild(tableRow);
    }
    <table border="1">
      <thead>
        <td>Hello World!</td>
      </thead>
      <tbody id="my-table-body"></tbody>
    </table>

    关于您的特定应用程序,如果您想探索创建 HTML 文档并将其内容附加到其他 HTMl 文档,请查看此答案:Cannot append DOM element to DIV node: Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node'

    【讨论】:

    • 我正在尝试将内容动态添加到我的表格中,问题是当我尝试将长字符串解析为 HTML 时
    • 我明白了,感谢您对表格的澄清。如果您在页面加载时动态添加内容,这应该可以工作,但对于实时更新(没有页面加载),您将需要事件侦听器、调度程序或某种框架。让我试验并更新我的答案
    • @Nestor 我已经更新了我的示例,以展示如何将appendChild 与表格一起使用。这有帮助吗?
    • 另外,请注意,除非您出于某种安全目的进行解析或从 XML 转换,否则无需解析 HTML。
    • 我不明白为什么你需要用你的 HTML 的 sn-p 创建一个完整的 HTML 文档(它并没有真正解析它,所以 parseHTML 是一个不准确的名称)然后附加该文档到 DOM。如果您验证/信任数据库中的数据,您应该能够生成一个字符串并逐个元素地添加或附加它。只要您正确格式化表格,它就不会丢失它的格式。这就是你传递给 createHTMLDocument 的 HTML 失去格式的原因:因为你正在创建一个以 标签开头的整个文档,而这些标签不在 . 中
    【解决方案3】:

    感谢@jaredgorski,我意识到为什么 html 代码会丢失格式,所以这是迄今为止最适合我的问题的解决方案。任何建议将不胜感激。

    function convert2Element (strHTML) {
        let table = document.createElement('table');
        table.appendChild(document.createElement('tbody'));
        table.querySelector('tbody').innerHTML = strHTML;
        return table.querySelector('tbody tr');
    }
    

    然后我可以附加返回的值并将其视为对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多