Нестандартные атрибуты, dataset
При написании HTML мы используем много стандартных атрибутов. Но что насчёт нестандартных, пользовательских? Давайте посмотрим, полезны они или нет, и для чего они нужны.
Иногда нестандартные атрибуты используются для передачи пользовательских данных из HTML в JavaScript, или чтобы «помечать» HTML-элементы для JavaScript.
#браузер #документ #атрибуты_свойств
При написании HTML мы используем много стандартных атрибутов. Но что насчёт нестандартных, пользовательских? Давайте посмотрим, полезны они или нет, и для чего они нужны.
Иногда нестандартные атрибуты используются для передачи пользовательских данных из HTML в JavaScript, или чтобы «помечать» HTML-элементы для JavaScript.
#браузер #документ #атрибуты_свойств
👍6🔥2
Атрибуты для стилизации элементов
Например, здесь для состояния заказа используется атрибут
Почему атрибут может быть предпочтительнее таких классов, как
Это потому, что атрибутом удобнее управлять. Состояние может быть изменено достаточно просто.
#браузер #документ #атрибуты_свойств
Например, здесь для состояния заказа используется атрибут
order-state
(см. картинку выше).Почему атрибут может быть предпочтительнее таких классов, как
.order-state-new
, .order-state-pending
, order-state-canceled
?Это потому, что атрибутом удобнее управлять. Состояние может быть изменено достаточно просто.
#браузер #документ #атрибуты_свойств
👍4🔥1
"Зарезервированные" атрибуты (dataset)
Все атрибуты, начинающиеся с префикса «data-», зарезервированы для использования программистами. Они доступны в свойстве
Например, если у
Атрибуты, состоящие из нескольких слов, к примеру
См. переписанный пример «состояния заказа» на картинке выше.
Использование
#браузер #документ #атрибуты_свойств
Все атрибуты, начинающиеся с префикса «data-», зарезервированы для использования программистами. Они доступны в свойстве
dataset
.Например, если у
elem
есть атрибут "data-about"
, то обратиться к нему можно как elem.dataset.about
.Атрибуты, состоящие из нескольких слов, к примеру
data-order-state
, становятся свойствами, записанными с помощью верблюжьей нотации (CamelCase): dataset.orderState
.См. переписанный пример «состояния заказа» на картинке выше.
Использование
data-*
атрибутов – валидный, безопасный способ передачи пользовательских данных.#браузер #документ #атрибуты_свойств
👍8🔥3
Пример: показать сообщение
Рассмотрим методы изменения документа на примере – а именно, добавим на страницу сообщение, которое будет выглядеть получше, чем
Это был пример HTML. Далее мы будем создавать такой же
#браузер #документ #изменение
Рассмотрим методы изменения документа на примере – а именно, добавим на страницу сообщение, которое будет выглядеть получше, чем
alert
.Это был пример HTML. Далее мы будем создавать такой же
div
, используя JavaScript (предполагаем, что стили в HTML или во внешнем CSS-файле).#браузер #документ #изменение
👍4🔥3
Создание элемента
DOM-узел можно создать двумя методами:
Большую часть времени нам нужно создавать узлы элементов, такие как
#браузер #документ #изменение
DOM-узел можно создать двумя методами:
document.createElement(tag)
- создаёт новый элемент с заданным тегом.document.createTextNode(text)
- создаёт новый текстовый узел с заданным текстом.Большую часть времени нам нужно создавать узлы элементов, такие как
div
для сообщения.#браузер #документ #изменение
👍8🔥2
Создание сообщения
В нашем случае сообщение – это
Мы создали элемент, но пока он только в переменной. Мы не можем видеть его на странице, поскольку он не является частью документа.
#браузер #документ #изменение
В нашем случае сообщение – это
div
с классом alert
и HTML в нём.Мы создали элемент, но пока он только в переменной. Мы не можем видеть его на странице, поскольку он не является частью документа.
#браузер #документ #изменение
👍4🔥2
Методы вставки, append
Чтобы наш
Для этого есть метод
#браузер #документ #изменение
Чтобы наш
div
появился, нам нужно вставить его где-нибудь в document
. Например, в document.body
.Для этого есть метод
append
, в нашем случае: document.body.append(div)
.#браузер #документ #изменение
👍4🔥4
Методы вставки
Вот методы для различных вариантов вставки:
#браузер #документ #изменение
Вот методы для различных вариантов вставки:
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
заданными узлами или строками.#браузер #документ #изменение
👍7🔥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».
#браузер #документ #изменение
👍9🔥2❤1
Удаление узлов
Для удаления узла есть методы
Например, сделаем так, чтобы наше сообщение удалялось через секунду.
Если нам нужно переместить элемент в другое место – нет необходимости удалять его со старого.
Все методы вставки автоматически удаляют узлы со старых мест.
#браузер #документ #изменение
Для удаления узла есть методы
node.remove()
.Например, сделаем так, чтобы наше сообщение удалялось через секунду.
Если нам нужно переместить элемент в другое место – нет необходимости удалять его со старого.
Все методы вставки автоматически удаляют узлы со старых мест.
#браузер #документ #изменение
👍7🔥1
Клонирование узлов: cloneNode
Как вставить ещё одно подобное сообщение?
Мы могли бы создать функцию и поместить код туда. Альтернатива – клонировать существующий
Иногда, когда у нас есть большой элемент, это может быть быстрее и проще.
Вызов
#браузер #документ #изменение
Как вставить ещё одно подобное сообщение?
Мы могли бы создать функцию и поместить код туда. Альтернатива – клонировать существующий
div
и изменить текст внутри него (при необходимости).Иногда, когда у нас есть большой элемент, это может быть быстрее и проще.
Вызов
elem.cloneNode(true)
создаёт «глубокий» клон элемента – со всеми атрибутами и дочерними элементами. Если мы вызовем elem.cloneNode(false)
, тогда клон будет без дочерних элементов.#браузер #документ #изменение
👍6🔥1
DocumentFragment
Мы можем добавить к нему другие узлы, но когда мы вставляем его куда-то, он «исчезает», вместо него вставляется его содержимое.
Например,
#браузер #документ #изменение
DocumentFragment
является специальным DOM-узлом, который служит обёрткой для передачи списков узлов.Мы можем добавить к нему другие узлы, но когда мы вставляем его куда-то, он «исчезает», вместо него вставляется его содержимое.
Например,
getListContent
ниже генерирует фрагмент с элементами <li>
, которые позже вставляются в <ul>
#браузер #документ #изменение
👍8❤1🔥1
Устаревшие методы вставки/удаления
Есть несколько других, более старых, методов вставки и удаления, которые существуют по историческим причинам.
Сейчас уже нет причин их использовать, так как современные методы
Мы упоминаем о них только потому, что их можно найти во многих старых скриптах:
#браузер #документ #изменение
Есть несколько других, более старых, методов вставки и удаления, которые существуют по историческим причинам.
Сейчас уже нет причин их использовать, так как современные методы
append
, prepend
, before
, after
, remove
, replaceWith
более гибкие и удобные.Мы упоминаем о них только потому, что их можно найти во многих старых скриптах:
parentElem.appendChild(node)
parentElem.insertBefore(node, nextSibling)
parentElem.replaceChild(node, oldChild)
parentElem.removeChild(node)
#браузер #документ #изменение
👍6❤2🔥2
Несколько слов о «document.write»
Есть ещё один, очень древний метод добавления содержимого на веб-страницу:
Вызов
Этот метод пришёл к нам со времён, когда ещё не было ни DOM, ни стандартов… Действительно старые времена. Он всё ещё живёт, потому что есть скрипты, которые используют его.
В современных скриптах он редко встречается из-за следующего важного ограничения:
Вызов
#браузер #документ #изменение
Есть ещё один, очень древний метод добавления содержимого на веб-страницу:
document.write
.Вызов
document.write(html)
записывает html
на страницу «прямо здесь и сейчас». Строка html
может быть динамически сгенерирована, поэтому метод достаточно гибкий. Мы можем использовать JavaScript, чтобы создать полноценную веб-страницу и записать её в документ.Этот метод пришёл к нам со времён, когда ещё не было ни DOM, ни стандартов… Действительно старые времена. Он всё ещё живёт, потому что есть скрипты, которые используют его.
В современных скриптах он редко встречается из-за следующего важного ограничения:
Вызов
document.write
работает только во время загрузки страницы.#браузер #документ #изменение
👍4🔥1
Стили и классы
Как правило, существует два способа задания стилей для элемента:
1) Создать класс в CSS и использовать его:
2) Писать стили непосредственно в атрибуте
JavaScript может менять и классы, и свойство
Классы – всегда предпочтительный вариант по сравнению со
Например, использование
В других случаях, например, чтобы сделать текст красным, добавить значок фона – описываем это в CSS и добавляем класс (JavaScript может это сделать). Это более гибкое и лёгкое в поддержке решение.
#браузер #документ #стили_классы
Как правило, существует два способа задания стилей для элемента:
1) Создать класс в CSS и использовать его:
<div class="...">
2) Писать стили непосредственно в атрибуте
style
: <div style="...">
.JavaScript может менять и классы, и свойство
style
.Классы – всегда предпочтительный вариант по сравнению со
style
. Мы должны манипулировать свойством style
только в том случае, если классы «не могут справиться».Например, использование
style
является приемлемым, если мы вычисляем координаты элемента динамически и хотим установить их из JavaScript.В других случаях, например, чтобы сделать текст красным, добавить значок фона – описываем это в CSS и добавляем класс (JavaScript может это сделать). Это более гибкое и лёгкое в поддержке решение.
#браузер #документ #стили_классы
👍8🔥1
className
Изменение класса является одним из наиболее часто используемых действий в скриптах.
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа
Поэтому для классов было введено схожее свойство
#браузер #документ #стили_классы
Изменение класса является одним из наиболее часто используемых действий в скриптах.
Когда-то давно в JavaScript существовало ограничение: зарезервированное слово типа
"class"
не могло быть свойством объекта. Это ограничение сейчас отсутствует, но в то время было невозможно иметь свойство elem.class
.Поэтому для классов было введено схожее свойство
"className"
: elem.className
соответствует атрибуту "class"
.#браузер #документ #стили_классы
👍3🔥1
classList
Так что мы можем работать как со строкой полного класса, используя
Методы
#браузер #документ #стили_классы
elem.classList
– это специальный объект с методами для добавления/удаления одного класса.Так что мы можем работать как со строкой полного класса, используя
className
, так и с отдельными классами, используя classList
. Выбираем тот вариант, который нам удобнее.Методы
classList
:elem.classList.add/remove("class")
– добавить/удалить класс.elem.classList.toggle("class")
– добавить класс, если его нет, иначе удалить.elem.classList.contains("class")
– проверка наличия класса, возвращает true/false
.#браузер #документ #стили_классы
👍11🔥2
Element style
Свойство
Для свойства из нескольких слов используется camelCase.
#браузер #документ #стили_классы
Свойство
elem.style
– это объект, который соответствует тому, что написано в атрибуте "style"
. Установка стиля elem.style.width="100px"
работает так же, как наличие в атрибуте style
строки width:100px
.Для свойства из нескольких слов используется camelCase.
#браузер #документ #стили_классы
👍3🔥1
Сброс стилей
Иногда нам нужно добавить свойство стиля, а потом, позже, убрать его.
Например, чтобы скрыть элемент, мы можем задать
Затем мы можем удалить свойство
Если мы установим в
#браузер #документ #стили_классы
Иногда нам нужно добавить свойство стиля, а потом, позже, убрать его.
Например, чтобы скрыть элемент, мы можем задать
elem.style.display = "none"
.Затем мы можем удалить свойство
style.display
, чтобы вернуться к первоначальному состоянию. Вместо delete elem.style.display
мы должны присвоить ему пустую строку: elem.style.display = ""
.Если мы установим в
style.display
пустую строку, то браузер применит CSS-классы и встроенные стили, как если бы такого свойства style.display
вообще не было.#браузер #документ #стили_классы
👍7🔥2
Полная перезапись
Обычно мы используем
Для задания нескольких стилей в одной строке используется специальное свойство
Это свойство редко используется, потому что такое присваивание удаляет все существующие стили: оно не добавляет, а заменяет их. Можно ненароком удалить что-то нужное. Но его можно использовать, к примеру, для новых элементов, когда мы точно знаем, что не удалим существующий стиль.
То же самое можно сделать установкой атрибута:
#браузер #документ #стили_классы
style.cssText
Обычно мы используем
style.*
для присвоения индивидуальных свойств стиля. Нельзя установить список стилей как, например, div.style="color: red; width: 100px"
, потому что div.style
– это объект, и он доступен только для чтения.Для задания нескольких стилей в одной строке используется специальное свойство
style.cssText
Это свойство редко используется, потому что такое присваивание удаляет все существующие стили: оно не добавляет, а заменяет их. Можно ненароком удалить что-то нужное. Но его можно использовать, к примеру, для новых элементов, когда мы точно знаем, что не удалим существующий стиль.
То же самое можно сделать установкой атрибута:
div.setAttribute('style', 'color: red...')
.#браузер #документ #стили_классы
👍3🔥2
Следите за единицами измерения
Не забудьте добавить к значениям единицы измерения.
Например, мы должны устанавливать
Пожалуйста, обратите внимание, браузер «распаковывает» свойство
#браузер #документ #стили_классы
Не забудьте добавить к значениям единицы измерения.
Например, мы должны устанавливать
10px
, а не просто 10
в свойство elem.style.top
. Иначе это не сработает.Пожалуйста, обратите внимание, браузер «распаковывает» свойство
style.margin
в последних строках и выводит style.marginLeft
и style.marginTop
из него.#браузер #документ #стили_классы
👍2🔥1