Динамическое добавление контента в таблицу с использованием Vanilla JS - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь добавить в таблицу столько строк, сколько пользователей в моей базе данных.Я получаю информацию о пользователях из бэкэнда через 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 и т. д.)

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Я часто использую шаблонные литералы для этого, создавая длинную строку 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: Невозможно добавить DOMэлемент к узлу DIV: Uncaught HierarchyRequestError: Не удалось выполнить 'appendChild' на 'узле'

0 голосов
/ 07 февраля 2019

Благодаря @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');
}

Тогда я могу добавить возвращаемое значение как и обработать его как объект.

0 голосов
/ 06 февраля 2019

Проблема, которую я вижу здесь, состоит в том, что вы используете tbody.innerHTML = html; вместо tbody.innerHTML += html;, когда вы используете оператор +=, вы сохраняете старый HTML, если вы используете =, вы заменяете старый HTML новымHTML

...