Вставка данных JSON с помощью «insertAdjacentElement» вместо «innerHTML»

Мне нужно использовать JSON для динамической загрузки данных на страницу.

Но я слышал, что innerHTML не защищён от XSS-атак, поэтому я предпочитаю всегда использовать textContent вместо него.

Для этого мне нужно добавить текстовые контейнеры с помощью insertAdjacentElement вместо того, чтобы помещать их в innerHTML = TEXT `, вот так.

Я пытался сделать это с помощью insertAdjacentElement, но проблема в том, что все элементы JSON помещаются в один текстовый контейнер.

Есть ли способ обернуть каждый Object.key тегами <> и </> без внутреннего HTML?

Большое спасибо.

ПРИМЕЧАНИЕ. Используйте (Ctrl + /) и (Alt + левую кнопку мыши), чтобы скрыть и отобразить каждый метод.

fetch("./b.json")
    .then(function (response) {
        return response.json();
    })
    .then(function (data) {
        console.info(data);

        const table = document.getElementById('data-input');
        
        const tableRow = document.createElement('tr');
        let th = document.createElement('th');
        let td = document.createElement('td');

        let textTitle = "";
        let text = "";

        for (let item of data) {
            // Required Method: insertAdjacentElement();

            table.insertAdjacentElement('afterbegin', tableRow);
            tableRow.insertAdjacentElement('beforeend', th);
            tableRow.insertAdjacentElement('beforeend', td);

            th.textContent += `${item.SpecifiedSeries}`;
            td.textContent += `
            ${item.Hero}
            ${item.Power}      
            `;

            // Original Method: innerHTML;

            // text += `
            //     <tr>
            //         <th>${item.SpecifiedSeries}</th>

            //         <td>${item.Hero}</td>
            //         <td>${item.Power}</td>
            //     </tr>
            // `;
        }

        // Original Method: innerHTML;

        // table.innerHTML = text;
    });
    
    // THE JSON FILE INCLUDED AS WELL:
    
    // [
    //     {
    //         "SpecifiedSeries": "Gravity Falls",
            
    //         "Hero": "Dipper & Mabel",
    //         "Power": "Cleverness, Determination..."
    //     },
        
    //     {
    //         "SpecifiedSeries": "Legend of Korra",
            
    //         "Hero": "Avatar Korra",
    //         "Power": "Mastering all 4 Elements..."
    //     }
    // ]
#container {
    position: fixed;
    z-index: 600;
    
    margin-top: 5%;

    overflow-y: scroll;

    left: 50%;
    transform: translate(-50%);

    bottom: 5%;

    height: clamp(48%, 90%, 90%);
    width: clamp(50%, 90%, 90%);

    border-radius: 24px;

    background-color: white;

    text-align: center;
}

#container table {
    margin-top: 5%;
}

table {
    font-family: sans-serif;
 
    width: 1400px;
    margin: 30px auto;
 
    box-shadow: 5px 10px 18px blue;
 
    table-layout: fixed;
 }
 
 table th {
    padding: 10px 0;
    background-color: #f4f4f4;
    border: thin solid #d4d4d4;
 }
 
 table td {
    padding: 10px;
    border: thin solid #d4d4d4;
    
    text-align: center;
    background-color: #fff;
 }
 
 table img {
    width: 70%;
 }
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Document</title>

    <link rel = "stylesheet" href = "a.css">
</head>
<body>
    <div id = "container">
        <table>
          <thead>
            <tr>
              <th style = "background-color: blue;"></th>
              <th>Hero</th>
              <th>Power</th>
            </tr>
          </thead>
          <tbody id = "data-input"></tbody>
        </table>
      </div>

      <script src = "a.js"></script>
</body>
</html>

Если вы хотите создать таблицу динамически, лучшим выбором будет HTMLTable API.

Teemu 01.08.2024 13:08

Пожалуйста, измените свой фрагмент, чтобы он имитировал JSON вместо выборки, что, вероятно, сработает.

mplungjan 01.08.2024 13:11

Спасибо за совет, но мне нужно знать, как это работает конкретно с InsertAdjacentElement, поскольку мне нужно, чтобы он работал с другими тегами, а также с таблицей. @Теему

Stuck Overflow 01.08.2024 13:19

Вы также должны поместить вызовы document.createElement внутри цикла for. В настоящее время вы присваиваете значение элементу, а затем присваиваете другое значение тому же элементу на следующей итерации цикла.

Sjoertjuh 01.08.2024 13:21

УХ ТЫ! Я думаю, что это самый короткий полезный ответ, который я когда-либо видел! Оно работает! Но есть одна проблема: данные вставляются в противоположном направлении (от последнего к первому). Как я могу это исправить? Большое спасибо! @Sjoertjuh

Stuck Overflow 01.08.2024 13:26

Я не знаю, какой у вас сейчас код, но думаю, что table.insertAdjacentElement('afterbegin', tableRow); следует использовать beforeend вместо afterbegin.

Sjoertjuh 01.08.2024 13:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете изменить код на что-то вроде этого.

fetch("./b.json")
.then(function (response) {
    return response.json();
})
.then(function (data) {
    const table = document.getElementById('data-input');

    data.forEach(function(item) {
        // Create table row
        const tableRow = document.createElement('tr');

        // Create table cells (td)
        const th = document.createElement('th');
        const tdHero = document.createElement('td');
        const tdPower = document.createElement('td');

        // Set text content for each cell
        th.textContent = item.SpecifiedSeries;
        tdHero.textContent = item.Hero;
        tdPower.textContent = item.Power;

        // Append cells to the row
        tableRow.appendChild(th);
        tableRow.appendChild(tdHero);
        tableRow.appendChild(tdPower);

        // Append row to the table body
        table.appendChild(tableRow);
    });
})
.catch(function(error) {
    console.info('Error fetching JSON: ', error);
});

Спасибо большое, все работает отлично!!

Stuck Overflow 01.08.2024 13:33

Просто вопрос: он должен работать и с циклом for of, верно?

Stuck Overflow 01.08.2024 14:25

@StuckOverflow Почему бы не попробовать?

mplungjan 01.08.2024 15:12

Другие вопросы по теме