Методы вставки
Вот методы для различных вариантов вставки:
#браузер #документ #изменение
Вот методы для различных вариантов вставки:
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
заданными узлами или строками.#браузер #документ #изменение
👍13❤4🔥3
insertAdjacentHTML/Text/Element
С этим может помочь другой, довольно универсальный метод:
Первый параметр – это специальное слово, указывающее, куда по отношению к
Второй параметр – это HTML-строка, которая будет вставлена именно «как HTML».
#браузер #документ #изменение
С этим может помочь другой, довольно универсальный метод:
elem.insertAdjacentHTML(where, html)
.Первый параметр – это специальное слово, указывающее, куда по отношению к
elem
производить вставку. Значение должно быть одним из следующих:"beforebegin"
– вставить html
непосредственно перед elem
,"afterbegin"
– вставить html
в начало elem
,"beforeend"
– вставить html
в конец elem
,"afterend"
– вставить html
непосредственно после elem
.Второй параметр – это HTML-строка, которая будет вставлена именно «как HTML».
#браузер #документ #изменение
👍16🔥1
Удаление узлов
Для удаления узла есть методы
Например, сделаем так, чтобы наше сообщение удалялось через секунду.
Если нам нужно переместить элемент в другое место – нет необходимости удалять его со старого.
Все методы вставки автоматически удаляют узлы со старых мест.
#браузер #документ #изменение
Для удаления узла есть методы
node.remove()
.Например, сделаем так, чтобы наше сообщение удалялось через секунду.
Если нам нужно переместить элемент в другое место – нет необходимости удалять его со старого.
Все методы вставки автоматически удаляют узлы со старых мест.
#браузер #документ #изменение
👍10❤2🔥2
Клонирование узлов: cloneNode
Как вставить ещё одно подобное сообщение?
Мы могли бы создать функцию и поместить код туда. Альтернатива – клонировать существующий
Иногда, когда у нас есть большой элемент, это может быть быстрее и проще.
Вызов
#браузер #документ #изменение
Как вставить ещё одно подобное сообщение?
Мы могли бы создать функцию и поместить код туда. Альтернатива – клонировать существующий
div
и изменить текст внутри него (при необходимости).Иногда, когда у нас есть большой элемент, это может быть быстрее и проще.
Вызов
elem.cloneNode(true)
создаёт «глубокий» клон элемента – со всеми атрибутами и дочерними элементами. Если мы вызовем elem.cloneNode(false)
, тогда клон будет без дочерних элементов.#браузер #документ #изменение
👍8🔥2
DocumentFragment
Мы можем добавить к нему другие узлы, но когда мы вставляем его куда-то, он «исчезает», вместо него вставляется его содержимое.
Например,
#браузер #документ #изменение
DocumentFragment
является специальным DOM-узлом, который служит обёрткой для передачи списков узлов.Мы можем добавить к нему другие узлы, но когда мы вставляем его куда-то, он «исчезает», вместо него вставляется его содержимое.
Например,
getListContent
ниже генерирует фрагмент с элементами <li>
, которые позже вставляются в <ul>
#браузер #документ #изменение
👍11🔥4
Устаревшие методы вставки/удаления
Есть несколько других, более старых, методов вставки и удаления, которые существуют по историческим причинам.
Сейчас уже нет причин их использовать, так как современные методы
Мы упоминаем о них только потому, что их можно найти во многих старых скриптах:
#браузер #документ #изменение
Есть несколько других, более старых, методов вставки и удаления, которые существуют по историческим причинам.
Сейчас уже нет причин их использовать, так как современные методы
append
, prepend
, before
, after
, remove
, replaceWith
более гибкие и удобные.Мы упоминаем о них только потому, что их можно найти во многих старых скриптах:
parentElem.appendChild(node)
parentElem.insertBefore(node, nextSibling)
parentElem.replaceChild(node, oldChild)
parentElem.removeChild(node)
#браузер #документ #изменение
👍8🔥1
Несколько слов о «document.write»
Есть ещё один, очень древний метод добавления содержимого на веб-страницу:
Вызов
Этот метод пришёл к нам со времён, когда ещё не было ни DOM, ни стандартов… Действительно старые времена. Он всё ещё живёт, потому что есть скрипты, которые используют его.
В современных скриптах он редко встречается из-за следующего важного ограничения:
Вызов
#браузер #документ #изменение
Есть ещё один, очень древний метод добавления содержимого на веб-страницу:
document.write
.Вызов
document.write(html)
записывает html
на страницу «прямо здесь и сейчас». Строка html
может быть динамически сгенерирована, поэтому метод достаточно гибкий. Мы можем использовать JavaScript, чтобы создать полноценную веб-страницу и записать её в документ.Этот метод пришёл к нам со времён, когда ещё не было ни DOM, ни стандартов… Действительно старые времена. Он всё ещё живёт, потому что есть скрипты, которые используют его.
В современных скриптах он редко встречается из-за следующего важного ограничения:
Вызов
document.write
работает только во время загрузки страницы.#браузер #документ #изменение
👍11🔥4
Стили и классы
Как правило, существует два способа задания стилей для элемента:
1) Создать класс в CSS и использовать его:
2) Писать стили непосредственно в атрибуте
JavaScript может менять и классы, и свойство
Классы – всегда предпочтительный вариант по сравнению со
Например, использование
В других случаях, например, чтобы сделать текст красным, добавить значок фона – описываем это в CSS и добавляем класс (JavaScript может это сделать). Это более гибкое и лёгкое в поддержке решение.
#браузер #документ #стили_классы
Как правило, существует два способа задания стилей для элемента:
1) Создать класс в CSS и использовать его:
<div class="...">
2) Писать стили непосредственно в атрибуте
style
: <div style="...">
.JavaScript может менять и классы, и свойство
style
.Классы – всегда предпочтительный вариант по сравнению со
style
. Мы должны манипулировать свойством style
только в том случае, если классы «не могут справиться».Например, использование
style
является приемлемым, если мы вычисляем координаты элемента динамически и хотим установить их из JavaScript.В других случаях, например, чтобы сделать текст красным, добавить значок фона – описываем это в CSS и добавляем класс (JavaScript может это сделать). Это более гибкое и лёгкое в поддержке решение.
#браузер #документ #стили_классы
👍5🔥1
className
Изменение класса является одним из наиболее часто используемых действий в скриптах.
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа
Поэтому для классов было введено схожее свойство
#браузер #документ #стили_классы
Изменение класса является одним из наиболее часто используемых действий в скриптах.
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа
"class"
не могло быть свойством объекта. Это ограничение сейчас отсутствует, но в то время было невозможно иметь свойство elem.class
.Поэтому для классов было введено схожее свойство
"className"
: elem.className
соответствует атрибуту "class"
.#браузер #документ #стили_классы
👍15🔥4❤2
classList
Так что мы можем работать как со строкой полного класса, используя
Методы
#браузер #документ #стили_классы
elem.classList
– это специальный объект с методами для добавления/удаления одного класса.Так что мы можем работать как со строкой полного класса, используя
className
, так и с отдельными классами, используя classList
. Выбираем тот вариант, который нам удобнее.Методы
classList
:elem.classList.add/remove("class")
– добавить/удалить класс.elem.classList.toggle("class")
– добавить класс, если его нет, иначе удалить.elem.classList.contains("class")
– проверка наличия класса, возвращает true/false
.#браузер #документ #стили_классы
👍12🔥2
Element style
Свойство
Для свойства из нескольких слов используется camelCase.
#браузер #документ #стили_классы
Свойство
elem.style
– это объект, который соответствует тому, что написано в атрибуте "style"
. Установка стиля elem.style.width="100px"
работает так же, как наличие в атрибуте style
строки width:100px
.Для свойства из нескольких слов используется camelCase.
#браузер #документ #стили_классы
👍9🔥3❤1
Сброс стилей
Иногда нам нужно добавить свойство стиля, а потом, позже, убрать его.
Например, чтобы скрыть элемент, мы можем задать
Затем мы можем удалить свойство
Если мы установим в
#браузер #документ #стили_классы
Иногда нам нужно добавить свойство стиля, а потом, позже, убрать его.
Например, чтобы скрыть элемент, мы можем задать
elem.style.display = "none"
.Затем мы можем удалить свойство
style.display
, чтобы вернуться к первоначальному состоянию. Вместо delete elem.style.display
мы должны присвоить ему пустую строку: elem.style.display = ""
.Если мы установим в
style.display
пустую строку, то браузер применит CSS-классы и встроенные стили, как если бы такого свойства style.display
вообще не было.#браузер #документ #стили_классы
👍17🔥3
Полная перезапись
Обычно мы используем
Для задания нескольких стилей в одной строке используется специальное свойство
Это свойство редко используется, потому что такое присваивание удаляет все существующие стили: оно не добавляет, а заменяет их. Можно ненароком удалить что-то нужное. Но его можно использовать, к примеру, для новых элементов, когда мы точно знаем, что не удалим существующий стиль.
То же самое можно сделать установкой атрибута:
#браузер #документ #стили_классы
style.cssText
Обычно мы используем
style.*
для присвоения индивидуальных свойств стиля. Нельзя установить список стилей как, например, div.style="color: red; width: 100px"
, потому что div.style
– это объект, и он доступен только для чтения.Для задания нескольких стилей в одной строке используется специальное свойство
style.cssText
Это свойство редко используется, потому что такое присваивание удаляет все существующие стили: оно не добавляет, а заменяет их. Можно ненароком удалить что-то нужное. Но его можно использовать, к примеру, для новых элементов, когда мы точно знаем, что не удалим существующий стиль.
То же самое можно сделать установкой атрибута:
div.setAttribute('style', 'color: red...')
.#браузер #документ #стили_классы
👍21🔥4
Следите за единицами измерения
Не забудьте добавить к значениям единицы измерения.
Например, мы должны устанавливать
Пожалуйста, обратите внимание, браузер «распаковывает» свойство
#браузер #документ #стили_классы
Не забудьте добавить к значениям единицы измерения.
Например, мы должны устанавливать
10px
, а не просто 10
в свойство elem.style.top
. Иначе это не сработает.Пожалуйста, обратите внимание, браузер «распаковывает» свойство
style.margin
в последних строках и выводит style.marginLeft
и style.marginTop
из него.#браузер #документ #стили_классы
👍7🔥2
Вычисленные стили: метод в лоб
Итак, изменить стиль очень просто. Но как его прочитать?
Например, мы хотим знать размер, отступы, цвет элемента. Как это сделать?
Свойство
Поэтому, используя
Например, здесь
#браузер #документ #стили_классы
Итак, изменить стиль очень просто. Но как его прочитать?
Например, мы хотим знать размер, отступы, цвет элемента. Как это сделать?
Свойство
style
оперирует только значением атрибута "style"
, без учёта CSS-каскада.Поэтому, используя
elem.style
, мы не можем прочитать ничего, что приходит из классов CSS.Например, здесь
style
не может видеть отступы.#браузер #документ #стили_классы
👍7🔥3
Вычисленные стили: getComputedStyle
Что, если нам нужно, скажем, увеличить отступ на
Для этого есть метод:
Результат вызова – объект со стилями, похожий на
#браузер #документ #стили_классы
Что, если нам нужно, скажем, увеличить отступ на
20px
? Для начала нужно его текущее значение получить.Для этого есть метод:
getComputedStyle(element, [pseudo])
.Результат вызова – объект со стилями, похожий на
elem.style
, но с учётом всех CSS-классов.#браузер #документ #стили_классы
👍10🔥4
Вычисленное (computed) и окончательное (resolved) значения
Есть две концепции в CSS:
- Вычисленное (computed) значение – это то, которое получено после применения всех CSS-правил и CSS-наследования. Например,
- Окончательное (resolved) значение – непосредственно применяемое к элементу. Значения
Давным-давно
Так что, в настоящее время
#браузер #документ #стили_классы
Есть две концепции в CSS:
- Вычисленное (computed) значение – это то, которое получено после применения всех CSS-правил и CSS-наследования. Например,
height:1em
или font-size:125%
.- Окончательное (resolved) значение – непосредственно применяемое к элементу. Значения
1em
или 125%
являются относительными. Браузер берёт вычисленное значение и делает все единицы измерения фиксированными и абсолютными, например, height:20px
или font-size:16px
. Для геометрических свойств разрешённые значения могут иметь плавающую точку, например, width:50.5px
.Давным-давно
getComputedStyle
был создан для получения вычисленных значений, но оказалось, что окончательные значения гораздо удобнее, и стандарт изменился.Так что, в настоящее время
getComputedStyle
фактически возвращает окончательное значение свойства, для геометрии оно обычно в пикселях.#браузер #документ #стили_классы
👍10❤1🔥1
getComputedStyle требует полное свойство!
Для правильного получения значения нужно указать точное свойство. Например:
Например, если есть свойства
Есть и другие несоответствия. Например, некоторые браузеры (Chrome) отображают
#браузер #документ #стили_классы
Для правильного получения значения нужно указать точное свойство. Например:
paddingLeft
, marginTop
, borderTopWidth
. При обращении к сокращённому: padding
, margin
, border
– правильный результат не гарантируется.Например, если есть свойства
paddingLeft/paddingTop
, то что мы получим вызывая getComputedStyle(elem).padding
? Ничего, или, может быть, «сгенерированное» значение из известных внутренних отступов? Стандарта для этого нет.Есть и другие несоответствия. Например, некоторые браузеры (Chrome) отображают
10px
в документе выше (см. картинку), а некоторые (Firefox) – нет.#браузер #документ #стили_классы
👍5🔥3
Стили, применяемые к посещённым :visited ссылкам, скрываются!
Посещённые ссылки могут быть окрашены с помощью псевдокласса
Но
JavaScript не видит стили, применяемые с помощью
#браузер #документ #стили_классы
Посещённые ссылки могут быть окрашены с помощью псевдокласса
:visited
.Но
getComputedStyle
не даёт доступ к этой информации, чтобы произвольная страница не могла определить, посещал ли пользователь ту или иную ссылку, проверив стили.JavaScript не видит стили, применяемые с помощью
:visited
. Кроме того, в CSS есть ограничение, которое запрещает в целях безопасности применять к :visited
CSS-стили, изменяющие геометрию элемента. Это гарантирует, что нет обходного пути для «злой» страницы проверить, была ли ссылка посещена и, следовательно, нарушить конфиденциальность.#браузер #документ #стили_классы
👍8🔥4
Итого по стилям и классам
Для управления классами существуют два DOM-свойства:
-
-
Чтобы изменить стили:
- Свойство
- Свойство
Для чтения окончательных стилей (с учётом всех классов, после применения CSS и вычисления окончательных значений) используется:
- Метод
#браузер #документ #стили_классы
Для управления классами существуют два DOM-свойства:
-
className
– строковое значение, удобно для управления всем набором классов.-
classList
– объект с методами add/remove/toggle/contains
, удобно для управления отдельными классами.Чтобы изменить стили:
- Свойство
style
является объектом со стилями в формате camelCase. Чтение и запись в него работают так же, как изменение соответствующих свойств в атрибуте "style"
. Чтобы узнать, как добавить в него important
и делать некоторые другие редкие вещи – смотрите документацию.- Свойство
style.cssText
соответствует всему атрибуту "style"
, полной строке стилей.Для чтения окончательных стилей (с учётом всех классов, после применения CSS и вычисления окончательных значений) используется:
- Метод
getComputedStyle(elem, [pseudo])
возвращает объект, похожий по формату на style
. Только для чтения.#браузер #документ #стили_классы
👍8🔥2
Размеры и прокрутка элементов
Существует множество JavaScript-свойств, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики. В этой главе мы будем называть их «метрики».
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript.
#браузер #документ #размеры
Существует множество JavaScript-свойств, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики. В этой главе мы будем называть их «метрики».
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript.
#браузер #документ #размеры
👍7🔥1