You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-`attributeOldValue` -- записать старое значение атрибута (выводит `attributes`),
29
-
-`characterData` -- наблюдать ли за `node.data` (содержимое текста),
29
+
-`characterData` -- наблюдать ли за `node.data` (текстовое содержимое),
30
30
-`characterDataOldValue` -- записать старое значение `node.data` (выводит `characterData`),
31
31
-`attributeFilter` -- массив имён атрибутов, чтобы наблюдать только за выбранными.
32
32
33
-
Затем, после изменений, выполняется `callback`со списком объектов [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord) в качестве первого аргумента, а сам наблюдатель вторым аргументом.
33
+
Затем, после изменений, выполняется `callback` со списком объектов [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord) в качестве первого аргумента, а сам наблюдатель идёт вторым аргументом.
34
34
35
-
Объекты [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord)имеют следующие свойства:
35
+
Объекты [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord)имеют следующие свойства:
36
36
37
37
-`type` -- тип изменения, один из
38
38
-`"attributes"` изменён атрибут
39
39
-`"characterData"` изменены данные `elem.data`, это для текстовых узлов
-`previousSibling/nextSibling` -- предыдущий или следующий одноуровневый элемент для добавленных/удалённых элементов,
44
44
-`attributeName/attributeNamespace` -- имя/пространство имён (для XML) изменённого атрибута,
45
45
-`oldValue` -- предыдущее значение, только для изменений атрибута или текста.
46
46
47
47
48
-
Возьмём `<div>` с атрибутом `contentEditable`. Этот атрибут позволяет нам сфокусироваться на нём, например, кликнув, и редактировать.
48
+
Возьмём `<div>` с атрибутом `contentEditable`. Этот атрибут позволяет нам сфокусироваться на элементе, например, кликнув, и отредактировать содержимое.
Когда необходим `MutationObserver`? Существуют ли случаи когда он может быть полезен?
99
+
Когда необходим `MutationObserver`? Существуют ли случаи, когда он может быть полезен?
100
100
101
101
Мы можем отслеживать что-то вроде `contentEditable` и реализовать "undo/redo" с его помощью (записывать изменения с возможностью отмены). Но бывают и ситуации, когда `MutationObserver` хорошо подходит с архитектурной точки зрения.
102
102
@@ -112,7 +112,7 @@ mutationRecords = [{
112
112
...
113
113
```
114
114
115
-
Также на нашем сайте мы будем использовать JavaScript-библиотеку для подсветки синтаксиса, например [Prism.js](https://prismjs.com/). Вызов метода `Prism.highlightElem(pre)` ищет такие элементы `pre` и добавляет в них стили и теги, которые в итоге дают цветную подсветку синтаксиса, подобно той, которую вы видите в примерах здесь, на этой странице.
115
+
Также на нашем сайте мы будем использовать JavaScript-библиотеку для подсветки синтаксиса, например [Prism.js](https://prismjs.com/). Вызов метода `Prism.highlightElem(pre)` ищет такие элементы `pre` и добавляет в них стили и теги, которые в итоге дают цветную подсветку синтаксиса, подобно той, которую вы видите в примерах здесь, на этой странице.
116
116
117
117
Когда нам вызвать этот метод? Можно по событию `DOMContentLoaded` или просто внизу страницы написать код, который будет искать все `pre[class*="language"]` и вызывать `Prism.highlightElem` для них:
Пока всё просто, правда? В HTML есть фрагменты кода в `<pre>`, - для них мы включаем подсветку синтаксиса.
131
+
Пока всё просто, правда? В HTML есть фрагменты кода в `<pre>`, и для них мы включаем подсветку синтаксиса.
132
132
133
-
Идём дальше. Представим, что мы собираемся динамически подгружать материалы с сервера. Позже в учебнике мы выучим для этого [способы](info:fetch-basics). На данный момент имеет значение только то, что мы получаем HTML статьи с веб-сервера и показываем её по запросу:
133
+
Идём дальше. Представим, что мы собираемся динамически подгружать материалы с сервера. Позже в учебнике мы выучим для этого [способы](info:fetch-basics). На данный момент имеет значение только то, что мы получаем HTML-статью с веб-сервера и показываем её по запросу:
134
134
135
135
```js
136
-
let article =/* получить новое содержание с сервера */
136
+
let article =/* получить новый контент с сервера */
137
137
articleElem.innerHTML= article;
138
138
```
139
139
140
-
HTML подгружённой статьи `article` может содержать примеры кода. Нам нужно вызвать`Prism.highlightElem` для них, чтобы подсветить синтаксис.
140
+
HTML подгруженной статьи `article` может содержать примеры кода. Нам нужно вызвать `Prism.highlightElem` для них, чтобы подсветить синтаксис.
141
141
142
142
**Кто и когда должен вызывать `Prism.highlightElem` для динамически загруженной статьи?**
143
143
144
144
Мы можем добавить этот вызов к коду, который загружает статью, например, так:
145
145
146
146
```js
147
-
let article =/* получить новое содержание с сервера */
147
+
let article =/* получить новый контент с сервера */
...Но представьте, что у нас есть много мест в коде, где мы загружаем что-либо: статьи, опросы, посты форумов. Нужно ли нам в каждый такой вызов добавлять `Prism.highlightElem`? Это не очень удобно, и легко забыть.
156
+
...Но представьте, что у нас есть много мест в коде, где мы загружаем что-либо: статьи, опросы, посты форума. Нужно ли нам в каждый такой вызов добавлять `Prism.highlightElem`? Получится не очень удобно, а также можно легко забыть сделать это.
157
157
158
158
А что, если содержимое загружается вообще сторонним кодом? Например, у нас есть форум, написанный другим человеком, загружающий содержимое динамически, и нам захотелось добавить к нему выделение синтаксиса. Никто не любит править чужие скрипты.
159
159
160
160
К счастью, есть другой вариант.
161
161
162
162
Мы можем использовать `MutationObserver`, чтобы автоматически определять примеры кода, вставленные в страницу, и выделять их.
163
163
164
-
Так что весь функционал для подсветки синтаксиса будет в одном месте, мы будем избавлены от необходимости интегрировать его.
164
+
Так что весь функционал для подсветки синтаксиса будет в одном месте, а мы будем избавлены от необходимости интегрировать его.
165
165
166
166
## Пример динамической подсветки синтаксиса
167
167
168
168
Вот работающий пример.
169
169
170
-
Если вы запустите этот код, он начнёт наблюдать за элементом ниже, подсвечивая код любого примера кода, который появляется там:
170
+
Если вы запустите этот код, он начнёт наблюдать за элементом ниже, подсвечивая код любого примера, который появляется там:
171
171
172
172
```js run
173
173
let observer =newMutationObserver(mutations=> {
@@ -176,7 +176,7 @@ let observer = new MutationObserver(mutations => {
176
176
// проверка новых узлов
177
177
178
178
for(let node ofmutation.addedNodes) {
179
-
// мы будем отслеживать только узлы-элементы, другие (текстовые) пропустить
179
+
// мы будем отслеживать только узлы-элементы, другие (текстовые) пропускаем
180
180
if (!(node instanceofHTMLElement)) continue;
181
181
182
182
// проверить, не является ли вставленный элемент примером кода
Теперь у нас есть `MutationObserver`, который может отслеживать все выделения в наблюдаемых элементах или во всём документе. Мы можем добавлять/удалять фрагменты кода в HTML, не задумываясь об их подсветке.
218
+
Теперь у нас есть `MutationObserver`, который может отслеживать вставку кода в наблюдаемых элементах или во всём документе. Мы можем добавлять/удалять фрагменты кода в HTML, не задумываясь об их подсветке.
-`mutationRecords = observer.takeRecords()` -- получает список необработанных записей изменений, которые произошли, но колбэк для них ещё не выполнился.
229
229
230
230
```js
231
-
// мы отключаем наблюдатель
232
-
// он возможно не успел обработать некоторые изменения
231
+
// мы отключаем наблюдатель
232
+
// он, возможно, не успел обработать некоторые изменения
233
233
let mutationRecords =observer.takeRecords();
234
234
// обработать mutationRecords
235
235
236
236
// теперь всё выполнилось, отключить
237
237
observer.disconnect();
238
238
```
239
239
240
-
## Сбор мусора
240
+
## Сборка мусора
241
241
242
-
Объекты `MutationObserver` используют внутри себя так называемые "слабые ссылки" на узлы, за которыми смотрят. Так что если узел удалён из DOM и больше недостижим, то он будет удалён из памяти, не смотря на наличие наблюдателя.
242
+
Объекты `MutationObserver` используют внутри себя так называемые ["слабые ссылки"](https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%B0%D0%B1%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0) на узлы, за которыми смотрят. Так что если узел удалён из DOM и больше недостижим, то он будет удалён из памяти вне зависимости от наличия наблюдателя.
243
243
244
244
245
245
## Итого
246
246
247
-
`MutationObserver` может реагировать на изменения в DOM: атрибуты, добавленные/удалённые элементы, содержание текста.
247
+
`MutationObserver` может реагировать на изменения в DOM: атрибуты, добавленные/удалённые элементы, текстовое содержимое.
248
248
249
-
Мы можем использовать его, чтобы отслеживать изменения, внедрённые другими частями нашего собственного или чужого кода.
249
+
Мы можем использовать его, чтобы отслеживать изменения, производимые другими частями нашего собственного или чужого кода.
250
250
251
-
Например, чтобы осуществить последующую обработку динамически вставленного содержимого, такого как пример `innerHTML`, выделенного на примере выше.
251
+
Например, чтобы осуществить обработку (подсветку кода) динамически вставленного содержимого, как в демо выше с `innerHTML`.
0 commit comments