Свойства innerHTML, textContent и innerText: примеры использования в DOM
Содержимое элементов: ключевые свойства и методы
Основной способ получения текстового содержимого
Свойство textContent возвращает текст всех дочерних узлов, включая скрытые, без интерпретации HTML. Для установки текста также следует использовать textContent, если не требуется разметка. Это безопаснее и быстрее, чем innerHTML.
const el = document.getElementById('example');
console.log(el.textContent);
el.textContent = 'Новый текст';Dom js (dom в javascript)
Как вставить HTML-разметку внутрь элемента?
Свойство innerHTML позволяет получить или задать HTML-содержимое. При присвоении строка парсится и заменяет всё содержимое. Типичная ошибка: XSS-уязвимость при вставке непроверенных данных.
el.innerHTML = 'Важно';Javascript document (объект document в javascript)
Проблема: потеря ссылок на DOM-объекты после замены innerHTML. Все обработчики событий на старых узлах удаляются. Решение: использовать методы создания узлов (createElement, appendChild).
Как получить только видимый текст с учётом CSS?
Свойство innerText возвращает отображаемый текст, учитывая стили (скрытые элементы игнорируются). Вызывает перерасчёт layout, поэтому медленнее textContent. Используется для копирования текста как видит пользователь.
console.log(element.innerText);
Js кнопка (создание и обработка кнопок в javascript)
Ошибка: innerText может не включать текст элементов с display:none. Если нужен весь текст (включая скрытый), используйте textContent.
Как заменить элемент вместе с его содержимым?
Свойство outerHTML возвращает HTML самого элемента и его потомков. При присвоении элемент в DOM заменяется новым узлом. Важно: переменная, ссылающаяся на старый элемент, остаётся ссылкой на удалённый узел.
el.outerHTML = 'Новый абзац
';Javascript nodes (javascript nodes (узлы))
Типичная ошибка: после замены el больше не указывает на новый элемент. Необходимо обновить ссылку, например, через document.querySelector.
Как вставить HTML в определённое место без замены всего содержимого?
Метод insertAdjacentHTML принимает позицию (beforebegin, afterbegin, beforeend, afterend) и строку HTML. Не затрагивает существующие узлы.
el.insertAdjacentHTML('beforeend', 'Новый пункт ');Javascript следующий (javascript: получение следующего элемента)
Проблемы: при использовании неправильной позиции возможна вставка в неожиданное место. Рекомендуется проверять совместимость с браузерами (поддерживается всеми современными).
Как безопасно добавить текст, избегая XSS?
Метод document.createTextNode создаёт текстовый узел, который не интерпретируется как HTML. Узел добавляется через appendChild или insertBefore.
const safe = document.createTextNode('');
el.appendChild(safe);Ошибка: создание текстового узла неэкранирует уже существующий HTML в строке? createTextNode всегда создаёт текст, поэтому опасности нет.
Расширенные примеры работы с содержимым
Пример 1: Пакетная вставка с DocumentFragment
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const li = document.createElement('li');
li.textContent = `Элемент ${i}`;
fragment.appendChild(li);
}
list.appendChild(fragment);Весь список добавляется одной операцией, уменьшая количество перерисовок.
Пример 2: Разница textContent и innerText
const div = document.createElement('div');
div.innerHTML = 'Видимый текст';
console.log('textContent:', div.textContent);
console.log('innerText:', div.innerText);textContent: 'Видимый скрытый текст' innerText: 'Видимый текст'
Пример 3: Экранирование HTML для безопасной вставки
function escapeHtml(str) {
const div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
}
const userInput = '
';
const safeHtml = escapeHtml(userInput);
el.innerHTML = safeHtml;Вставленный код не выполнится, символы экранированы.
Пример 4: outerHTML и потеря ссылки
let el = document.querySelector('span');
console.log(el); // живой элемент
el.outerHTML = 'жирный';
console.log(el); // всё ещё ссылается на старый удалённый spanПосле outerHTML переменная el не обновляется.
Пример 5: insertAdjacentHTML с позицией afterend
const p = document.querySelector('p');
p.insertAdjacentHTML('afterend', '
');После абзаца появляется горизонтальная линия.
Пример 6: Производительность textContent vs innerHTML
// Плохо: innerHTML разбирает строку заново
for (let i = 0; i < 1000; i++) {
el.innerHTML = `Значение ${i}`;
}
// Хорошо: textContent только меняет текст
for (let i = 0; i < 1000; i++) {
el.textContent = `Значение ${i}`;
}Второй цикл выполняется быстрее, так как нет парсинга HTML.
Пример 7: Создание текстового узла через createTextNode
const div = document.createElement('div');
const text = document.createTextNode('Текст с HTML');
div.appendChild(text);
document.body.appendChild(div);На странице отобразится строка 'Текст с HTML', жирного не будет.