Изменение HTML
Бирка парома уже на странице: лодка называется Gull, время 09:10, заметка говорит Boarding. Менять HTML значит писать новое содержимое в элемент, который уже в руках. boat.textContent = "Heron" кладёт слова Heron как текст. note.textContent = "<em>Late</em>" показывает эти символы, и note.querySelector("em") равен null. note.innerHTML = "<em>Late</em>" строит em, чей текст Late. После этого note.textContent равен Late, а note.innerHTML всё ещё содержит теги. Вторая запись, note.innerHTML = "Dock 2", удаляет этот em. note.insertAdjacentHTML("beforeend", " <span>gate B</span>") сохраняет Dock 2 и добавляет gate B, заметка читается Dock 2 gate B. Времени ничего не присваивают, поэтому оно остаётся 09:10.
Запись, а не новый поиск
Прошлая страница сравнивала способы найти узел. Эта не считает коллекцию, не читает индекс и не идёт по parentElement. getElementById только отдаёт бирку. Урок в том значении, которое ты присваиваешь.
Что каждая запись оставляет в заметке
Заметка начинается как Boarding. Читай строки по порядку. Каждое присваивание заменяет заметку или удлиняет её.
📊 Что каждая запись оставляет в заметке
| Запись | Что видно | Что остаётся | Легко спутать |
|---|---|---|---|
textContent = "Heron" у лодки |
Heron | один текстовый узел | элемент с именем Heron |
textContent = "<em>Late</em>" |
символы <em>Late</em> |
нет элемента em |
настоящий em |
innerHTML = "<em>Late</em>" |
Late | один em |
ждать теги внутри textContent |
innerHTML = "Dock 2" |
Dock 2 | em исчез |
em рядом с Dock 2 |
insertAdjacentHTML("beforeend", " <span>gate B</span>") |
Dock 2 gate B | Dock 2 плюс span |
innerHTML, который убирает Dock 2 |
textContent хранит строку и не разбирает теги. innerHTML разбирает теги и выбрасывает каждого ребёнка, который уже был у элемента. insertAdjacentHTML тоже разбирает теги, но beforeend ставит новые узлы после текущего содержимого. Имя лодки, набранное у окна, идёт в textContent. Та же строка в innerHTML примет знак «меньше» за разметку.
Прочитай бирку до записи
Файл открывается тремя значениями. Присваивания ещё не было.
console.log(document.getElementById("boat").textContent);
console.log(document.getElementById("when").textContent);
console.log(document.getElementById("note").textContent);
В журнале Gull, 09:10 и Boarding. Время — отдельный абзац. Дальнейшие записи не трогают when.
Слова остаются словами
textContent заменяет каждого ребёнка одним текстовым узлом. Символы, похожие на тег, остаются символами.
let boat = document.getElementById("boat");
let note = document.getElementById("note");
boat.textContent = "Heron";
note.textContent = "<em>Late</em>";
console.log(boat.textContent);
console.log(note.textContent);
console.log(note.querySelector("em"));
Первая строка — Heron. Вторая — символы <em>Late</em>. Третья — null. Заметка показывает тег как текст и не построила элемент.
innerHTML строит элемент
Отдай те же символы в innerHTML. Разборщик превращает строку в узлы и заменяет то, что было в заметке.
let note = document.getElementById("note");
note.innerHTML = "<em>Late</em>";
console.log(note.textContent);
console.log(note.innerHTML);
console.log(note.querySelector("em") === null);
Первая строка — Late. Вторая — <em>Late</em>, потому что innerHTML возвращает разметку вместе с тегами. Третья — false: em есть, значит это не null. Видимые слова и строка разметки — два чтения одного элемента.
Следующий innerHTML стирает em
Новое значение innerHTML заменяет всю заметку. em не остаётся рядом с новым текстом.
let note = document.getElementById("note");
note.innerHTML = "Dock 2";
console.log(note.textContent);
console.log(note.querySelector("em"));
Первая строка — Dock 2. Вторая — null. Boarding уже не было. Эта запись уносит и em.
Добавь gate B и сохрани Dock 2
insertAdjacentHTML("beforeend", ...) разбирает фрагмент и ставит его в конец. Эта строка начинается с пробела, чтобы две части остались двумя словами. Другие позиции есть. На этой странице только beforeend.
let note = document.getElementById("note");
note.insertAdjacentHTML("beforeend", " <span>gate B</span>");
console.log(note.textContent);
console.log(note.querySelector("span").textContent);
Первая строка — Dock 2 gate B. Вторая — gate B. Dock 2 всё ещё в заметке. Та же строка span через innerHTML удалила бы Dock 2.
Строка под биркой
Скрипт стоит в конце body, когда бирка уже есть. Он запоминает слово Late до того, как Dock 2 заменит em, и пишет строку из имени лодки, этого слова и заметки после добавления gate B.
<!DOCTYPE html>
<html>
<head>
<title>changing html — page</title>
</head>
<body>
<article id="slip">
<h2 id="boat">Gull</h2>
<p id="when">09:10</p>
<p id="note">Boarding</p>
<p id="line">…</p>
</article>
<script>
let boat = document.getElementById("boat");
let note = document.getElementById("note");
boat.textContent = "Heron";
note.innerHTML = "<em>Late</em>";
let late = note.textContent;
note.innerHTML = "Dock 2";
note.insertAdjacentHTML("beforeend", " <span>gate B</span>");
document.getElementById("line").textContent = boat.textContent + " / " + late + " / " + note.textContent;
</script>
</body>
</html>
Строка читается Heron / Late / Dock 2 gate B. Время по-прежнему 09:10. Late в строке — слово, сохранённое до стирания. Сама заметка больше не говорит Late. Следующая страница меняет CSS у таких элементов и не добавляет новый способ их выбирать.
Проверь бирку
- Выведи три начальных текста и жди Gull, 09:10 и Boarding
- Поставь лодке Heron, а заметке символы em; жди эту строку и em равный null
- Поставь innerHTML в строку em; жди textContent Late, innerHTML всё ещё с тегами, и em не null
- Поставь innerHTML в Dock 2 и жди null для em
- Добавь span через beforeend и жди Dock 2 gate B, затем текст span — gate B
- Прочитай строку и жди Heron / Late / Dock 2 gate B; прочитай время и жди 09:10
Промахи на этой бирке
Страница всё равно открывается. Присваивание записало не тот вид значения.
- Кладёшь имя, набранное у окна, в
innerHTML, где<становится разметкой - Ждёшь, что
textContent = "<em>Late</em>"создастem - Читаешь
textContentпосле записи em и ждёшь теги в этой строке - Снова присваиваешь
innerHTMLи ждёшь, чтоemостанется - Добавляешь gate B через
innerHTMLи теряешь Dock 2 - Теряешь ведущий пробел, и заметка читается
Dock 2gate B - Ставишь
styleздесь; следующая страница меняет CSS - Зовёшь
createElementздесь; более поздняя страница строит новые узлы
Унеси это
textContentпишет простой текст и не разбирает тегиinnerHTMLразбирает теги и заменяет каждого ребёнка- После записи em
textContentравен Late, аinnerHTMLвсё ещё содержит теги - Второй
innerHTMLудаляетem insertAdjacentHTML("beforeend", ...)добавляет разметку и сохраняет Dock 2- Время остаётся 09:10, потому что ему ничего не присваивают
- Строка читается Heron / Late / Dock 2 gate B
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху