Тег <img> не работает внутри тега <td> при автоматическом создании из файла JavaScript

В настоящее время я работаю над школьным проектом, где я должен разработать веб-приложение для DotA 2, где я создал HTML-таблицу, которая должна отображать статистику конкретного героя из DotA 2 по сравнению с другими героями. Всего героев 118, поэтому в таблице будет 117 строк. Эта таблица соответствий также имеет четыре столбца:

  • Герой (имя героя)
  • Игр сыграно
  • Шанс на победу
  • Преимущество

Для визуальной справки, изображение ниже близко к тому же макету, к которому я стремлюсь: (кредит opendota.com).

Как и на изображении выше, я также хотел бы иметь небольшой аватар изображения вместе с именем Героя в каждой строке в столбце HERO, например, «Void Spirit», «Rubick» и «Clockwerk».

Поскольку я не хочу вручную заполнять 118 строк в своем HTML-коде, я попытался разработать файл JavaScript, который сделает это за меня, что можно увидеть ниже:

const matchupTableBody = document.querySelector(".matchup-table > tbody");
const numberOfHeroes = 118;

function loadMatchups() {
    for (i = 0; i < numberOfHeroes; i++) {
        currentHero = getHero(i);
        populateMatchups(getHeroImage(currentHero));
    }
}

// Populate the table, importing the API and hero data.
function populateMatchups(heroImagePath) {

    // create new table row
    const tr = document.createElement("tr");

    // create new table cell / data
    const td = document.createElement("td");

    // load the table cell with a img tag and the heroImagePath
    td.textContent = '<img src = "' + heroImagePath + '"/>';

    tr.appendChild(td);

    matchupTableBody.appendChild(tr);
}

document.addEventListener("DOMContentLoaded", () => { loadMatchups(); });

функция loadMatchups() загружает путь аватара изображения героя (который я сохранил локально на своем компьютере) и отправляет этот путь изображения в функцию populateMatchups(). Короче говоря, функция populateMatchups() создает новую строку таблицы для каждого из 117 других героев и создает новую ячейку таблицы с тегом, указывающим на путь аватара изображения героя на моей машине.

Однако это не работает при автоматической генерации этим JavaScript, как видно на изображении ниже, в моей собственной таблице:

Что меня действительно смущает, так это то, что два пути, выделенные синим цветом, прекрасно работают, если вручную вставить их в первый элемент таблицы (первый путь, выделенный синим цветом, — это оранжевый парень справа в первой строке, а второй выделенный путь — красный парень слева в первом ряду). Но это не работает при создании из моего файла JavaScript.

И я просто не могу понять, почему (хотя я новичок в JavaScript, поэтому я думаю, что проблема именно в этом). Может ли кто-нибудь помочь или указать мне в правильном направлении?

Вот мой HTML-код для таблицы:

<div class = "matchup-table-container">
        <table class = "matchup-table">
            <thead>
                <tr>
                    <th>HERO</th>
                    <th>GAMES PLAYED</th>
                    <th>WIN RATE</th>
                    <th>ADVANTAGE</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><img src = "ressources/images/heroes/axe_sb.png"></td>
                    <td> <img src = "ressources/images/heroes/antimage_sb.png">
                    </td>
                    <td>50</td>
                    <td>
                        <img src = "ressources/images/heroes/snapfire_sb.png">
                    </td>
                </tr>
            </tbody>
        </table>
    </div>

Обновлено: К сожалению, я забыл добавить соответствующее закрытие "/ в файл JavaScript, который я опубликовал первым - я пробовал это раньше, и это не сработало, поэтому я что-то изменил и забыл изменить обратно, прежде чем я опубликовал здесь. При просмотре моего JavaScript через консоли браузера, я вижу, что это работает в том смысле, что все 117 тегов создаются с правильным путем к изображению, поскольку я могу скопировать путь к изображению из консоли браузера и вручную вставить его в тег, а затем он загружается.

Кажется, у вас есть несоответствующие двойные кавычки - открытие src img, но не завершение его. Лучше всего запустить свой код, а затем в инструментах разработчика браузера посмотреть, какие элементы вы на самом деле сгенерировали.

A Haworth 12.12.2020 23:15

Спасибо за ответ! Если я вас правильно понял, это то, о чем вы говорите? td.textContent = '<img src = "' + heroImagePath + '"/>'; Что я должен закрыть тег <img> с помощью />? Я на самом деле пробовал это раньше, но это все еще не работает. Вот почему я запутался в этом вопросе. Тем не менее, я вижу, что с моей стороны было глупо забыть добавить «/» в закрывающий тег img в приведенном выше коде, это мое плохое извинение.

Christoffer Ashorn 12.12.2020 23:19

Я так думаю, это td.textContent = '<img src = "' + heroImagePath + '>'; в коде вашего вопроса - отсутствует закрывающая двойная кавычка.

A Haworth 12.12.2020 23:21

О боже, тогда я выложил слишком ранний снимок экрана. Я несколько раз пытался добавить это: td.textContent = '<img src = "' + heroImagePath + '"/>'; чтобы полный путь стал следующим: <img src = "ressources/images/heroes/antimage_sb.png"/>. Но это, к сожалению, не решает мою проблему. Я скопировал этот точный путь вручную в первую строку таблицы, а затем изображения загружаются нормально.

Christoffer Ashorn 12.12.2020 23:24
Поведение ключевого слова "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
4
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, проблема в том, что вы пытаетесь вставить HTML как текстовое содержимое.

Попробуйте заменить эту строку

// load the table cell with a img tag and the heroImagePath
td.textContent = '<img src = "' + heroImagePath + '">';

С этим:

var image = document.createElement('img');
image.setAttribute("src", heroImagePath);
td.appendChild(image);

или это:

td.innerHTML = '<img src = "' + heroImagePath + '">';

Оба работали идеально, большое спасибо! Итак, если я правильно понимаю, метод .textContent заставляет тег <td> интерпретировать все как строку, а не читать как HTML? Где, с другой стороны, .innerHTML читает строку как HTML-код и фактически отображает изображения?

Christoffer Ashorn 12.12.2020 23:37

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