InnerText не отображается после установки сразу после создания элемента

Я делаю компонент реакции для выбора и отмены выбора тегов. Для этого нужно, чтобы теги отображались в таблице с флажком рядом с ними. Моя проблема в том, что я не могу установить текстовую часть при создании их с помощью javaScript. Ни через innerHTML, ни через innerText. Он отображается в инспекторе, но не в моем браузере (Chromium).

Пока мой метод выглядит так:

generateTagTable() {
    let tbl = document.getElementById('tagTable')
    tbl.className = 'tagTable'
    let tbdy = document.createElement('tbody')
    for (let i = 0; i < this.allTags.length; i++) {
        let tr = document.createElement('tr')
        let td = document.createElement('td')
        let div = document.createElement('div')
        let cb = document.createElement('input')
        div.className = 'checkContainer'
        cb.id = 'checkTd'
        cb.type = 'checkbox'
        cb.innerText = 'Tag'
        div.appendChild(cb)
        td.appendChild(div)
        tr.appendChild(td)
        tbdy.appendChild(tr)
    }
    tbl.appendChild(tbdy)
}

Что приводит к следующему:

InnerText не отображается после установки сразу после создания элемента

Я знаю, что могу достичь своей цели, сделав следующее:

generateTagTable() {
        let tbl = document.getElementById('tagTable')
        tbl.className = 'tagTable'
        let tbdy = document.createElement('tbody')
        for (let i = 0; i < this.allTags.length; i++) {
            let tr = document.createElement('tr')
            let td = document.createElement('td')
            td.className = 'checkContainer'
            td.innerHTML = '<div class = "flexcenter"><input type = "checkbox" name = "tagCheck"/>' + this.allTags[i] + '</div>'
            tr.appendChild(td)
            tbdy.appendChild(tr)
        }
        tbl.appendChild(tbdy)
    }

Но это оставляет у меня проблему при попытке назначить onclick и, как правило, оставляет мне меньше контроля, как я чувствую.

Результат рабочего таков, и я пытаюсь достичь этого:

InnerText не отображается после установки сразу после создания элемента

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
1 093
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Флажки (элементы input в целом) не имеют содержимого (они пустые элементы), поэтому innerText, textContent и innerHTML не имеют по отношению к ним никакой функции.

Если вы хотите, чтобы текст рядом с вашим флажком, обычно оборачивают его вокруг label. В разметке это будет:

<label>
    <input type = "checkbox">
    Text
</label>

Корректируя свой код, вы можете:

// ...
let td = document.createElement('td')
let div = document.createElement('div')
let label = document.createElement('label')  // *** (added)
label.innerText = 'Tag'                      // *** (moved and modified)
let cb = document.createElement('input')
div.className = 'checkContainer'
cb.id = 'checkTd'
cb.type = 'checkbox'
label.insertBefore(cb, label.firstChild);    // *** (added)
div.appendChild(label)                       // *** (modified)
// ...

Тем не менее, было бы намного проще использовать разметку (tr.innerHTML = ...), а браузеры используют разметку синтаксического анализа очень быстро.

// ...
let tr = document.createElement('tr')
tr.innerHTML = `
    <td>
        <div class = "checkContainer">
            <label>
                <input type = "checkbox" id = "checkTd">
                Tag
            </label>
        </div>
    </td>`;
tbdy.appendChild(tr)
// ...

Боковое примечание: в его нынешнем виде ваш код создает несколько элементов input с одним и тем же id (checkTd). Это неверно, только элемент один в документе может иметь этот id. В зависимости от того, что вы делаете, вам может вообще не понадобиться id, или вам может потребоваться добавить к нему суффикс (возможно, используя i), чтобы сделать его уникальным.

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