Модификации DOM – это ключ к созданию «живых» страниц.
Здесь мы увидим, как создавать новые элементы «на лету» и изменять уже существующие.
Пример: показать сообщение
Рассмотрим методы на примере – а именно, добавим на страницу сообщение, которое будет выглядеть получше, чем alert
.
Вот такое:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<div class="alert">
<strong>Всем привет!</strong> Вы прочитали важное сообщение.
</div>
Это был пример HTML. Теперь давайте создадим такой же div
, используя JavaScript (предполагаем, что стили в HTML или во внешнем CSS-файле).
Создание элемента
DOM-узел можно создать двумя методами:document.createElement(tag)
Создаёт новый элемент с заданным тегом:
let div = document.createElement('div');
document.createTextNode(text)
Создаёт новый текстовый узел с заданным текстом:
let textNode = document.createTextNode('А вот и я');
Создание сообщения
В нашем случае сообщение – это div
с классом alert
и HTML в нём:
let div = document.createElement('div');
div.className = "alert";
div.innerHTML = "<strong>Всем привет!</strong> Вы прочитали важное сообщение.";
Мы создали элемент, но пока он только в переменной. Мы не можем видеть его на странице, поскольку он не является частью документа.
Методы вставки
Чтобы наш div
появился, нам нужно вставить его где-нибудь в document
. Например, в document.body
.
Для этого есть метод append
, в нашем случае: document.body.append(div)
.
Вот полный пример:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<script>
let div = document.createElement('div');
div.className = "alert";
div.innerHTML = "<strong>Всем привет!</strong> Вы прочитали важное сообщение.";
document.body.append(div);
</script>
Вот методы для различных вариантов вставки:
node.append(...nodes or strings)
– добавляет узлы или строки в конецnode
,node.prepend(...nodes or strings)
– вставляет узлы или строки в началоnode
,node.before(...nodes or strings)
–- вставляет узлы или строки доnode
,node.after(...nodes or strings)
–- вставляет узлы или строки послеnode
,node.replaceWith(...nodes or strings)
–- заменяетnode
заданными узлами или строками.
Вот пример использования этих методов, чтобы добавить новые элементы в список и текст до/после него:
<ol id="ol">
<li>0</li>
<li>1</li>
<li>2</li>
</ol>
<script>
ol.before('before'); // вставить строку "before" перед <ol>
ol.after('after'); // вставить строку "after" после <ol>
let liFirst = document.createElement('li');
liFirst.innerHTML = 'prepend';
ol.prepend(liFirst); // вставить liFirst в начало <ol>
let liLast = document.createElement('li');
liLast.innerHTML = 'append';
ol.append(liLast); // вставить liLast в конец <ol>
</script>
Наглядная иллюстрация того, куда эти методы вставляют:
Итоговый список будет таким:
before
<ol id="ol">
<li>prepend</li>
<li>0</li>
<li>1</li>
<li>2</li>
<li>append</li>
</ol>
after
Эти методы могут вставлять несколько узлов и текстовых фрагментов за один вызов.
Например, здесь вставляется строка и элемент:
<div id="div"></div>
<script>
div.before('<p>Привет</p>', document.createElement('hr'));
</script>
Весь текст вставляется как текст.
Поэтому финальный HTML будет:
<p>Привет</p>
<hr>
<div id="div"></div>
Другими словами, строки вставляются безопасным способом, как делает это elem.textContent
.
Поэтому эти методы могут использоваться только для вставки DOM-узлов или текстовых фрагментов.
А что, если мы хотим вставить HTML именно «как html», со всеми тегами и прочим, как делает это elem.innerHTML
?
insertAdjacentHTML/Text/Element
С этим может помочь другой, довольно универсальный метод: elem.insertAdjacentHTML(where, html)
.
Первый параметр – это специальное слово, указывающее, куда по отношению к elem
производить вставку. Значение должно быть одним из следующих:
"beforebegin"
– вставитьhtml
непосредственно передelem
,"afterbegin"
– вставитьhtml
в началоelem
,"beforeend"
– вставитьhtml
в конецelem
,"afterend"
– вставитьhtml
непосредственно послеelem
.
Второй параметр – это HTML-строка, которая будет вставлена именно «как HTML».
Например:
<div id="div"></div>
<script>
div.insertAdjacentHTML('beforebegin', '<p>Привет</p>');
div.insertAdjacentHTML('afterend', '<p>Пока</p>');
</script>
…Приведёт к:
<p>Привет</p>
<div id="div"></div>
<p>Пока</p>
Так мы можем добавлять произвольный HTML на страницу.
Варианты вставки:
Мы можем легко заметить сходство между этой и предыдущей картинкой. Точки вставки фактически одинаковые, но этот метод вставляет HTML.
У метода есть два брата:
elem.insertAdjacentText(where, text)
– такой же синтаксис, но строкаtext
вставляется «как текст», вместо HTML,elem.insertAdjacentElement(where, elem)
– такой же синтаксис, но вставляет элементelem
.
Они существуют, в основном, чтобы унифицировать синтаксис. На практике часто используется только insertAdjacentHTML
. Потому что для элементов и текста у нас есть методы append/prepend/before/after
– их быстрее написать, и они могут вставлять как узлы, так и текст.
Так что, вот альтернативный вариант показа сообщения:
<style>
.alert {
padding: 15px;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
background-color: #dff0d8;
}
</style>
<script>
document.body.insertAdjacentHTML("afterbegin", `<div class="alert">
<strong>Всем привет!</strong> Вы прочитали важное сообщение.
</div>`);
</script>