Skip to content

template

garevna edited this page Nov 5, 2018 · 7 revisions

🎓 <template>

✅ DocumentFragment
✅ content
✅ cloneNode ()

Элемент <template> предназначен для хранения шаблона разметки

⚠️ Он не отображается на странице
⚠️ Он парсится браузером, поэтому должен содержать только валидный код разметки

☕ 1️⃣

Откроем вкладку Elements инструментов разработчика и вставим в элемент body следующий код разметки:
<body>
    <template id="sample">
        <h3>Template header</h3>
        <p>Template text</p>
    </template>
</body>

При этом на странице ничего не появится, а вот во вкладке Elements мы увидим следующую картинку

<template id="sample">
  ▼ #document-fragment
     <h3>Template header</h3>
     <p>Template text</p>
  </template>

🎓 DocumentFragment

это фрагмент документа, у которого нет родителя в дереве DOM

DocumentFragment содержит DOM-элементы ( nodes ), как и объект document

Но поскольку фрагмент документа не является частью структуры DOM, он не отображается на странице

Это шаблон разметки, который при необходимости может быть вставлен в нужное время в нужном месте

🎓 content

Свойство content элемента template содержит код разметки, находящийся в контейнере <template>...</template>

☕ 2️⃣

Шаблон разметки
<template id="svg">
    <svg width="400" height="400">
        <circle cx="200" cy="200" 
                r="100" 
                fill="transparent"
                stroke="red" 
                style="stroke-width:5">
        </circle>
    </svg>
</template>
Выведем в консоль свойство content
const circle = document.querySelector ( "#svg" )
console.dir ( circle.content )
Результат
▼ #document-fragment
    baseURI: "about:blank"
    childElementCount: 2
  ► childNodes: NodeList(5) [text, h3, text, p, text]
  ► children: HTMLCollection(2) [h3, p]
  ► firstChild: text
  ► firstElementChild: h3
    isConnected: false
  ► lastChild: text
  ► lastElementChild: p
    nextSibling: null
    nodeName: "#document-fragment"
    nodeType: 11
    nodeValue: null
  ► ownerDocument: document
    parentElement: null
    parentNode: null
    previousSibling: null
    textContent: "↵        Template header↵        Template text↵    "
  ► __proto__: DocumentFragment

Вставка в DOM

Если выполнить код:

document.body.appendChild ( circle.content )

то после вставки в DOM содержимого шаблона контейнер <template id="svg"></template> будет пустым

Можно проверить это:

console.dir ( circle.content )

Свойство childNodes будет NodeList [ ] ( пустая коллекция узлов )

Свойство children будет HTMLCollection [ ] ( пустая коллекция элементов )

⚠️ Для многоразового использования шаблона разметки нужно использовать метод cloneNode ( true )

document.body.appendChild ( circle.content.cloneNode ( true ) )
✋ true указывает на глубокое копирование, т.е. всех подузлов дерева

☕ 1️⃣

Шаблон разметки
<template id="sample">
    <style>
        svg { border: dotted 1px; }
        circle { stroke-width:5; }
    </style>
    <svg width="400" height="400" id="svg">
        <circle cx="200" cy="200" r="100" 
                id="circle"
                fill="transparent" 
                stroke="red">
        </circle>
    </svg>
</template>
Класс
class CanvasElement extends HTMLElement {
    constructor () {
        super()
        var shadow = this.attachShadow ( { mode: 'open' } )
        var sample = document.querySelector ( "#sample" )
        shadow.appendChild ( sample.content )
    }
}
customElements.define ( 'canvas-element', CanvasElement )
Вставка на страницу
<canvas-element></canvas-element>

© Irina H.Fylyppova 2018
Использование данных материалов или любой их части коммерческими школами ( курсами ) является нарушением авторских прав


Новая версия


1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19

Занятие 1

⤵️

Занятие 2

⤴️ ⤵️

Занятие 3

⤴️ ⤵️

Занятие 4

⤴️ ⤵️

Занятие 5

⤴️ ⤵️

Занятие 6

⤴️ ⤵️

Занятие 7

⤴️ ⤵️

Занятие 8

⤴️ ⤵️

Занятие 9

⤴️ ⤵️

Занятие 10

⤴️ ⤵️

Занятие 11

⤴️ ⤵️

Занятие 12

⤴️ ⤵️

Занятие 13

⤴️ ⤵️

Занятие 14

⤴️ ⤵️

Занятие 15

⤴️ ⤵️

Занятие 16

⤴️ ⤵️

Занятие 17

⤴️ ⤵️

Занятие 18

⤴️ ⤵️

Занятие 19

⤴️ ⤵️

⤴️

ico20 Дополнительно
dir-20 Справочная инфо

Clone this wiki locally