Element — JavaScript — Дока
- Кратко
- Как пишется
- Как понять
- 💡 Свойства, связанные с HTML-атрибутами
- 💡 Свойства и методы, связанные с DOM
- 💡 Свойства с информацией о содержимом
- На практике
- Николай Лопин советует
Кратко
Скопировано
Элемент — это кусочек HTML в DOM-дереве. Браузер создаёт DOM для взаимодействия между JavaScript и HTML. Каждый HTML-тег при этом превращается в элемент DOM. Ещё такие элементы называют узлами.
Из DOM можно получить элемент и изменить его. Браузер заметит изменения и отобразит их на странице.
Как пишется
Скопировано
Например, можно поменять выравнивание у элемента h2
:
// получаем элемент из DOMconst element = document.getElementsByTagName('h2')[0]// после выполнения этого кода h2 будет выравнивать текст по центруelement. align = 'center'// меняем цвет шрифта на красныйelement.style.color = 'red'
// получаем элемент из DOM
const element = document.getElementsByTagName('h2')[0]
// после выполнения этого кода h2 будет выравнивать текст по центру
element.align = 'center'
// меняем цвет шрифта на красный
element.style.color = 'red'
Как понять
Скопировано
HTML-элементы содержат свойства, которые можно разделить на группы:
- свойства, связанные с HTML-атрибутами: id, классы, стили и так далее;
- свойства и методы связанные с обходом DOM: получение дочерних элементов, родителя, соседей;
- информация о содержимом;
- специфические свойства элемента.
Первые три группы свойств есть у всех элементов. Специфические свойства отличаются в зависимости от типа элемента. Например, у полей ввода есть свойства, которых нет у параграфов и блоков: value
, type
и другие.
💡 Свойства, связанные с HTML-атрибутами
Скопировано
Читать и записывать значения HTML-атрибутов можно при помощи свойств элемента. Название обычно совпадает с названием атрибута:
id
— получить идентификатор элемента.class
— список классов в HTML-атрибутеName class
.
const element = document.getElementsByTagName('div')[0]// напечатать список классов в консольconsole.log(element.className)// установить свой классelement.className = 'hacked'
const element = document.getElementsByTagName('div')[0]
// напечатать список классов в консоль
console.log(element.className)
// установить свой класс
element.className = 'hacked'
style
— добавить стили. Стили добавляются так же с помощью свойств. Свойства именуются по аналогии с CSS-свойствами:
const element = document.getElementsByTagName('div')[0]// CSS-свойство background-colorelement.style.backgroundColor = 'beige'// CSS-свойство colorelement.style.color = 'gray'// CSS-свойство margin-topelement.style.marginTop = '20px'
const element = document. getElementsByTagName('div')[0]
// CSS-свойство background-color
element.style.backgroundColor = 'beige'
// CSS-свойство color
element.style.color = 'gray'
// CSS-свойство margin-top
element.style.marginTop = '20px'
💡 Свойства и методы, связанные с DOM
Скопировано
children
— список дочерних элементов;parent
— получить родительский элемент;Element next
иElement Sibling previous
— получить следующий/предыдущий узел-сосед:Element Sibling
get
— поиск среди дочерних элементов по названию класса;Elements By Class Name ( ) get
— поиск среди дочерних элементов по названию тега;Elements By Tag Name ( ) query
— поиск первого дочернего элемента, подходящего под CSS-селектор;Selector ( ) query
— поиск всех дочерних элементов подходящих под CSS-селектор;Selector All ( )
С помощью этих свойств и методов можно перемещаться по дереву и даже обойти все его элементы, если это нужно.
💡 Свойства с информацией о содержимом
Скопировано
inner
— это свойство возвращает HTML-код всего, что вложено в текущий элемент. При записи в это свойство, предыдущее содержимое будет затёрто. Страница отобразит новое содержимое:H T M L
const divElement = document.getElementsByTagName('div')[0]divElement.innerHTML = '<p>Добавлен из кода</p>'// после выполнения этого кода, на странице отобразится параграф с указанным текстомconst divElement = document.getElementsByTagName('div')[0] divElement.innerHTML = '<p>Добавлен из кода</p>' // после выполнения этого кода, на странице отобразится параграф с указанным текстом
outer
— это свойство возвращает HTML-код текущего элемента и всего, что в него вложено. При записи в это свойство, предыдущее содержимое будет затёрто.H T M L text
— свойство, возвращает текст всех вложенных узлов без HTML-тегов.Content
Почувствуй разницу на демо:
Открыть демо в новой вкладкеНа практике
Скопировано
Николай Лопин советует
Скопировано
🛠 Если нужно добавить текст в элемент, то всегда используйте свойство text
. Другие свойства обрабатывают HTML, это может привести к дырам в безопасности.
🛠 Для работы с классами элемента есть удобные методы, доступные через свойство class
:
- добавить класс — метод
add
.( ) - удалить класс — метод
remove
.( )
const element = document.getElementsByTagName('div')[0]element.classList.add('hello')element.classList.remove('bye')
const element = document. getElementsByTagName('div')[0]
element.classList.add('hello')
element.classList.remove('bye')
🛠 В HTML часто используют data-атрибуты. Они используются, когда нужно передать данные через HTML. Например, когда сервер собирает стартовый HTML, он может поместить значения в data-атрибуты. Фронтендер затем может использовать их, вместо того, чтобы отправлять запрос на сервер. Название таких атрибутов начинаются с префикса data
. Для доступа к ним из JavaScript используется свойство
:
const element = document.getElementsByTagName('div')[0]// получить значение атрибута data-columns тега divconsole.log(element.dataset.columns)// изменить значениеelement.dataset.columns = 99
const element = document.getElementsByTagName('div')[0]
// получить значение атрибута data-columns тега div
console.log(element.dataset.columns)
// изменить значение
element.dataset.columns = 99
🛠 У элементов очень много свойств. Если нужно что-то получить из элемента, то скорее всего уже есть свойство, которое хранит эти данные.
🛠 Если нужно удалить элемент и все вложенные в него, воспользуйтесь методом remove
:
const element = document.querySelector('#some-element')element.remove()
const element = document.querySelector('#some-element')
element.remove()
Если вы нашли ошибку, отправьте нам пул-реквест!
Во время отправки формы что-то пошло не так. Попробуйте ещё раз?
←
.cookie
ctrl + alt + ←
→
.add
ctrl + alt + →
Фрагменты в React. Не знаете, как решить проблему… | by Daria Sidorova | NOP::Nuances of Programming
При работе с React лучше использовать многоразовые компоненты с помощью таких инструментов, как Bit, чтобы избежать необходимости переписывать их каждый раз. К тому же, приятно использовать компоненты, организованные в визуальной галерее, не так ли?
Попробуйте визуализировать несколько компонентов React подобным образом:
class ParentC extends React.Component {
render() {
return (
<ChildC />
<ChildC />
)
}
}class ChildC extends React.Component {
render() {
return (
<h2>
Child Component
</h2>
)
}
}
или создать подобный список узлов:
class ChildComponent extends React.Component {
render() {
return (
<h2>Hello Child Component</h2>
<h2>Hello Child Component</h2>
)
}
}
При использовании VS Code с расширениями поддержки JSX, появится предупреждение: “Родительские выражения JSX должны иметь один родительский элемент”.
Чтобы предупреждение исчезло, нужно добавить дополнительный тег div в качестве родительского элемента в разметку JSX.
class ParentC extends React.Component {
render() {
return (
<div>
<ChildComponent />
<ChildComponent />
</div>
)
}
}class ChildComponent extends React. Component {
render() {
return (
<div>
<h2>Hello Child Component</h2>
<h2>Hello Child Component</h2>
</div>
)
}
}
Проблема заключается в том, что использовать теги div немного неудобно. В HTML встречаются случаи, когда дополнительный div может деструктурировать DOM. Например, при использовании таблицы в компонентах.
Нам нужно визуализировать данные пользователей в табличной форме с помощью HTML-элемента table. Нужно визуализировать следующий код в React:
<table>
<tr>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</tr>
<tr>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</tr>
<tr>
<td>Row Ekemezie</td>
<td>Software Dev</td>
<td>? :)</td>
</tr>
</table>
Создадим компоненты для визуализации каждого аспекта элемента table. HeaderComponent отобразит заголовок таблицы, BodyComponent — тело таблицы. TableComponent визуализирует каркас таблицы с HeaderComponent и BodyComponent таким образом:
class TableComponent extends React.Component {
render() {
return (
<table>
<tr>
<HeaderComponent />
</tr>
<tr>
<BodyComponent />
</tr>
</table>
)
}
}
HeaderComponent должен выглядеть так:
class HeaderComponent extends React.Component {
render() {
return (
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
)
}
}
А BodyComponent выглядит вот так:
class BodyComponent extends React.Component {
render() {
return (
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
)
}
}
Проблема с HeaderComponent и BodyComponent заключается в том, что они выполняют возврат нескольких узлов. React предупредит о необходимости вложить разметку во вложенный тег.
Затем выполняем подобные действия, чтобы устранить предупреждение:
class HeaderComponent extends React.Component {
render() {
return (
<div>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</div>
)
}
}class BodyComponent extends React.Component {
render() {
return (
<div>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</div>
)
}
}
Разметка вложена в тег div. Теперь на выходе компонент Table будет выглядеть так:
<table>
<tr>
<div>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</div>
</tr>
<tr>
<div>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</div>
</tr>
</table>
Выше приведен неправильный вывод элемента table. Элемент div не должен быть отображен. Компоненты React предназначены для возврата элементов, но они должны быть заключены в родительский тег, несколько элементов не могут быть возвращены. Однако добавление дополнительного узла иногда приводит к неправильному форматированию html-элемента output, как показано выше.
Как решить эту проблему? Каким образом можно возвратить заключенные элементы JSX, не влияя на визуализированный вывод в DOM?
Фрагменты React способны решить эту проблему!
С помощью фрагментов можно сгруппировать список дочерних элементов без добавления дополнительных узлов в DOM.
Используя <React.Fragment>...</React.Fragment>
, можно добавить родительский тег к элементам JSX без добавления дополнительного узла к DOM. React.Fragment не выводит HTMLElement.
Приступим к решению первой проблемы:
class ParentC extends React.Component {
render() {
return (
<ChildC />
<ChildC />
)
}
}class ChildC extends React. Component {
render() {
return (
<h2>
Child Component
</h2>
)
}
}
Теперь выполним вложение:
return (
<ChildC />
<ChildC />
)
в React.Fragment
. Получаем такой результат:
class ParentC extends React.Component {
render() {
return (
<React.Fragment>
<ChildC />
<ChildC />
</React.Fragment>
)
}
}
Перейдем ко второму примеру:
class ParentC extends React.Component {
render() {
return (
<div>
<ChildComponent />
<ChildComponent />
</div>
)
}
}class ChildComponent extends React.Component {
render() {
return (
<div>
<h2>Hello Child Component</h2>
<h2>Hello Child Component</h2>
</div>
)
}
}
Удаляем теги div
и добавляем React.Fragment
вместо них:
class ParentC extends React. Component {
render() {
return (
<React.Fragment>
<ChildComponent />
<ChildComponent />
</React.Fragment>
)
}
}class ChildComponent extends React.Component {
render() {
return (
<React.Fragment>
<h2>Hello Child Component</h2>
<h2>Hello Child Component</h2>
</React.Fragment>
)
}
}
Переходим к третьему примеру и заменяем дополнительные теги div в BodyComponent и HeaderComponent на React.Fragment:
class HeaderComponent extends React.Component {
render() {
return (
<div>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</div>
)
}
}class BodyComponent extends React.Component {
render() {
return (
<div>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</div>
)
}
}|
|
|
vclass HeaderComponent extends React. Component {
render() {
return (
<React.Fragment>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</React.Fragment>
)
}
}class BodyComponent extends React.Component {
render() {
return (
<React.Fragment>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</React.Fragment>
)
}
}
Таблица будет отображена следующим образом:
<table>
<tr>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</tr>
<tr>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</tr>
</table>
Как мы и хотели, без лишних тегов div!!!
Если вам кажется, что многократное написание React.Fragment
занимает слишком много времени, то можно использовать сокращенный синтаксис. Он выглядит таким образом: <>...</>
. Теперь компоненты BodyComponent
и HeaderComponent
выглядят так:
class HeaderComponent extends React.Component {
render() {
return (
<React.Fragment>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</React.Fragment>
)
}
}class BodyComponent extends React.Component {
render() {
return (
<React.Fragment>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</React.Fragment>
)
}
}
Можно записать и таким образом:
class HeaderComponent extends React.Component {
render() {
return (
<>
<th>Name</th>
<th>Occupation</th>
<th>Age</th>
</>
)
}
}class BodyComponent extends React. Component {
render() {
return (
<>
<td>Chidume Nnamdi</td>
<td>Software Dev</td>
<td>27</td>
</>
)
}
}
Мы рассмотрели проблему невозможности возврата нескольких элементов и способ ее решения с помощью React.Fragment, а также научились использовать сокращенный синтаксис React.Fragment.
Благодаря React.Fragment можно насладиться преимуществом возврата нескольких элементов без необходимости добавлять дополнительные теги или теги div, которые окружают элементы и загромождают DOM.
Перевод статьи Chidume Nnamdi: Understanding Fragments in React
javascript — Что такое this.parentElement?
спросил
Изменено 3 месяца назад
Просмотрено 21к раз
pg. myfunc = функция () { переменная i = 1, j = 2; это.выбрано = 1; xx.newObject = this.parentElement; ...
Что такое xx.newObject = this.parentElement;
делаешь?
- javascript
Это то же самое, что и this.parentNode
: он дает вам узел, содержащий этот
как дочерний узел. это
будет pg
, предположительно какой-то элемент; this.parentNode
будет элементом, который его содержит, или объектом document
, если pg
является корневым элементом.
parentElement
— нестандартное расширение IE. Поскольку IE также поддерживает стандартное свойство parentNode
, parentElement
никогда не следует использовать.
В качестве альтернативы, это может быть просто произвольный объект со свойством parentElement
, и в этом случае это может быть что угодно. По этому коду нельзя сказать что-то реальное, но было бы необычно устанавливать произвольные свойства, такие как myfunc
, на узле элемента.
Сохраняет ссылку на родительский элемент в этом
. Например:
<диапазон>
В этом случае, если этот
соответствует дочернему элементу
span, parentElement
будет соответствовать родительскому элементу
div.
Тем не менее, вы всегда должны использовать parentNode
вместо parentElement
, поскольку parentElement
является проприетарным и (я полагаю) работает только с IE. Согласно MSDN:
К этому свойству не применим общедоступный стандарт.
Это невозможно узнать без контекста. Мы не знаем, что такое xx, и мы не знаем наверняка, что такое «этот» объект. parentElement МОЖЕТ быть свойством pg, но опять же эта функция может вызываться по-другому, например, если где-то она назначена как функция onclick:
someElement.onclick = pg.myfunc;
В этом случае это будет свойство некоторого элемента.
Как уже говорили другие, если «это» является элементом DOM, вы должны использовать parentNode, а не parentElement, поскольку последний нестандартен.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почтаОбязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Стилизовать родительский элемент в зависимости от количества дочерних элементов с помощью CSS :has() — Bram.
us В CSS можно стилизовать элементы в зависимости от количества их братьев и сестер, используя селектор nth-child
.
Но что, если вы хотите стилизовать родительский элемент в зависимости от количества дочерних элементов? Именно здесь в игру вступает селектор CSS :has()
.
~
# Код
Если вы пришли просто за кодом, вот он. Вы также можете увидеть его в действии в демо ниже.
/* Максимум 3 (3 или менее, исключая 0) детей */ ul: has(> :nth-child( -n+3 ):last-child) { контур: 1px сплошной красный; } /* Максимум 3 (3 или менее, включая 0) дочерних элементов */ ul:not(:has(>:nth-child( 3 ))) { контур: 1px сплошной красный; } /* Ровно 5 детей */ ul: has(> :nth-child( 5 ):last-child) { контур: 1px сплошной синий; } /* Не менее 10 (10 и более) детей */ ul:has(> :nth-child( 10 )) { контур: 1px сплошной зеленый; } /* От 7 до 9 детей (включительно) */ ul:has(> :nth-child( 7 )): has(> :nth-child( -n+9 ):last-child) { контур: 1px сплошной желтый; }
Если вы хотите знать, как это работает, продолжайте читать 🙂
~
# Селекторы
Шаблон каждого построенного здесь селектора таков:
parent:has(> count-condition ) { … }
- С помощью
parent:has()
мы можем выбратьродительский
элемент, который соответствует определенному условию для своих дочерних элементов. - Передавая
>
в:has()
, мы нацеливаемся народительских
прямых дочерних элементов. -
условие подсчета
— это то, что нам нужно придумать для каждого типа выбора, который мы хотим сделать. Как и в случае с количественными запросами, мы будем использовать:nth-child()
для этого.
Не более
x
дочерних элементов Используя :nth-child
с минусом -n
, можно выбрать первые x
дочерних элементов. Если один из них также является самым последним дочерним элементом, вы можете определить, есть ли у родителя до x
дочерних элементов
/* Не более 3 (3 или менее, исключая 0) дочерних элементов */ ul: has(> :nth-child( -n+3 ):last-child) { контур: 1px сплошной красный; }
Этот селектор исключает родителей, у которых нет детей. В большинстве случаев это нормально, поскольку любой элемент, содержащий только текст, будет сопоставляться, но если вы действительно хотите включить, используйте этот селектор:
/* Максимум 3 (3 или менее, включая 0) дочерних элементов */ ul:not(:has(> :nth-child( 3 ))) { контур: 1px сплошной красный; }
Ровно
x
детей Чтобы выбрать элемент x
из набора, вы можете использовать :nth-child
без каких-либо н
индикация. Если этот дочерний элемент также является последним дочерним элементом, вы знаете, что в родительском элементе ровно x
дочерних элементов
/* Ровно 5 дочерних элементов */ ul: has(> :nth-child( 5 ):last-child) { контур: 1px сплошной синий; }
Не менее
x
дочерних элементов Чтобы выбрать родителя с не менее чем x
дочерних элементов, достаточно иметь возможность выбрать в нем дочерний элемент размером x
, чтобы определить это. Здесь нет необходимости в :last-child
.
/* Не менее 10 (10 и более) детей */ ul: has (> : nth-child ( 10 )) { контур: 1px сплошной зеленый; }
Между
x
и y
детей Чтобы сделать промежуточный выбор, вы можете объединить два условия :has()
вместе. Первый выбирает все элементы, которые имеют x
или более дочерних элементов, тогда как второй отсекает диапазон, разрешая только элементы, которые имеют не более y
дочерних элементов. Будут рассчитаны только элементы, соответствующие обоим условиям:
/* От 7 до 9 детей (включительно) */ ul:has(> :nth-child( 7 )): has(> :nth-child( -n+9 ):last-child) { контур: 1px сплошной желтый; }
~
# Демонстрация
См. родительские элементы Pen Styling на основе количества дочерних элементов с помощью CSS :has() от Bramus (@bramus) на CodePen.
~
# Поддержка браузера
Эти селекторы поддерживаются всеми браузерами, имеющими :has()
поддержка. На момент написания это не включает Firefox.
Использование экспериментальной поддержки :has()
в Firefox также не помогает. Его реализация все еще является экспериментальной, так как пока поддерживает не все типы выделения. Относительный анализ селекторов (например, a:has(> b)
) — одна из тех функций, которые еще не поддерживаются. Отслеживание ошибки: #1774588
~
не стесняйтесь ретвитить его объявление:
Стиль родительского элемента в зависимости от количества его дочерних элементов с использованием CSS `:has()`
🔗 https://t.co/Kn0JjafCR4
🏷 #css #селекторы pic.twitter.com/ZMtm4IUD0P
— Bram.us (@bramusblog) 17 ноября 2022 г.
~
🔥 Нравится то, что вы видите? Хотите оставаться в курсе? Вот как:
- Подпишитесь на @bramus в Твиттере
- Подпишитесь на @bramus на Mastodon
- Подпишитесь на @bramusblog в Твиттере
- Подпишитесь на bram.us, используя RSS
Брамус — веб-разработчик из Бельгии, работающий инженером по связям с разработчиками Chrome в Google.