Skip to content

Commit 8b3e38d

Browse files
authored
Merge pull request #356 from xcurveballx/mutations-minor
правки по mutation observer
2 parents 6d9aa3e + bef3540 commit 8b3e38d

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

2-ui/99-ui-misc/01-mutation-observer/article.md

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,26 @@ observer.observe(node, config);
2626
- `subtree` -- во всех потомках `node`,
2727
- `attributes` -- атрибуты `node`,
2828
- `attributeOldValue` -- записать старое значение атрибута (выводит `attributes`),
29-
- `characterData` -- наблюдать ли за `node.data` (содержимое текста),
29+
- `characterData` -- наблюдать ли за `node.data` (текстовое содержимое),
3030
- `characterDataOldValue` -- записать старое значение `node.data` (выводит `characterData`),
3131
- `attributeFilter` -- массив имён атрибутов, чтобы наблюдать только за выбранными.
3232

33-
Затем, после изменений, выполняется `callback` со списком объектов [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord) в качестве первого аргумента, а сам наблюдатель вторым аргументом.
33+
Затем, после изменений, выполняется `callback` со списком объектов [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord) в качестве первого аргумента, а сам наблюдатель идёт вторым аргументом.
3434

35-
Объекты [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord)имеют следующие свойства:
35+
Объекты [MutationRecord](https://dom.spec.whatwg.org/#mutationrecord) имеют следующие свойства:
3636

3737
- `type` -- тип изменения, один из
3838
- `"attributes"` изменён атрибут
3939
- `"characterData"` изменены данные `elem.data`, это для текстовых узлов
4040
- `"childList"` добавлены/удаленые дочерние элементы,
41-
- `target` -- где произошло изменение: элемент для "attributes", текстовый узел для "characterData", или элемент для "childList" изменения,
41+
- `target` -- где произошло изменение: элемент для "attributes", текстовый узел для "characterData" или элемент для "childList",
4242
- `addedNodes/removedNodes` -- добавленные/удалённые узлы,
4343
- `previousSibling/nextSibling` -- предыдущий или следующий одноуровневый элемент для добавленных/удалённых элементов,
4444
- `attributeName/attributeNamespace` -- имя/пространство имён (для XML) изменённого атрибута,
4545
- `oldValue` -- предыдущее значение, только для изменений атрибута или текста.
4646

4747

48-
Возьмём `<div>` с атрибутом `contentEditable`. Этот атрибут позволяет нам сфокусироваться на нём, например, кликнув, и редактировать.
48+
Возьмём `<div>` с атрибутом `contentEditable`. Этот атрибут позволяет нам сфокусироваться на элементе, например, кликнув, и отредактировать содержимое.
4949

5050
```html run
5151
<div contentEditable id="elem">Отредактируй <b>меня</b>, пожалуйста</div>
@@ -96,7 +96,7 @@ mutationRecords = [{
9696

9797
## Пример использования наблюдателя
9898

99-
Когда необходим `MutationObserver` ? Существуют ли случаи когда он может быть полезен?
99+
Когда необходим `MutationObserver`? Существуют ли случаи, когда он может быть полезен?
100100

101101
Мы можем отслеживать что-то вроде `contentEditable` и реализовать "undo/redo" с его помощью (записывать изменения с возможностью отмены). Но бывают и ситуации, когда `MutationObserver` хорошо подходит с архитектурной точки зрения.
102102

@@ -112,7 +112,7 @@ mutationRecords = [{
112112
...
113113
```
114114

115-
Также на нашем сайте мы будем использовать JavaScript-библиотеку для подсветки синтаксиса, например [Prism.js](https://prismjs.com/). Вызов метода `Prism.highlightElem(pre)` ищет такие элементы `pre` и добавляет в них стили и теги, которые в итоге дают цветную подсветку синтаксиса, подобно той, которую вы видите в примерах здесь, на этой странице.
115+
Также на нашем сайте мы будем использовать JavaScript-библиотеку для подсветки синтаксиса, например [Prism.js](https://prismjs.com/). Вызов метода `Prism.highlightElem(pre)` ищет такие элементы `pre` и добавляет в них стили и теги, которые в итоге дают цветную подсветку синтаксиса, подобно той, которую вы видите в примерах здесь, на этой странице.
116116

117117
Когда нам вызвать этот метод? Можно по событию `DOMContentLoaded` или просто внизу страницы написать код, который будет искать все `pre[class*="language"]` и вызывать `Prism.highlightElem` для них:
118118

@@ -128,23 +128,23 @@ document.querySelectorAll('pre[class*="language"]').forEach(Prism.highlightElem)
128128
let hello = "world";
129129
```
130130

131-
Пока всё просто, правда? В HTML есть фрагменты кода в `<pre>`, - для них мы включаем подсветку синтаксиса.
131+
Пока всё просто, правда? В HTML есть фрагменты кода в `<pre>`, и для них мы включаем подсветку синтаксиса.
132132

133-
Идём дальше. Представим, что мы собираемся динамически подгружать материалы с сервера. Позже в учебнике мы выучим для этого [способы](info:fetch-basics). На данный момент имеет значение только то, что мы получаем HTML статьи с веб-сервера и показываем её по запросу:
133+
Идём дальше. Представим, что мы собираемся динамически подгружать материалы с сервера. Позже в учебнике мы выучим для этого [способы](info:fetch-basics). На данный момент имеет значение только то, что мы получаем HTML-статью с веб-сервера и показываем её по запросу:
134134

135135
```js
136-
let article = /* получить новое содержание с сервера */
136+
let article = /* получить новый контент с сервера */
137137
articleElem.innerHTML = article;
138138
```
139139

140-
HTML подгружённой статьи `article` может содержать примеры кода. Нам нужно вызвать `Prism.highlightElem` для них, чтобы подсветить синтаксис.
140+
HTML подгруженной статьи `article` может содержать примеры кода. Нам нужно вызвать `Prism.highlightElem` для них, чтобы подсветить синтаксис.
141141

142142
**Кто и когда должен вызывать `Prism.highlightElem` для динамически загруженной статьи?**
143143

144144
Мы можем добавить этот вызов к коду, который загружает статью, например, так:
145145

146146
```js
147-
let article = /* получить новое содержание с сервера */
147+
let article = /* получить новый контент с сервера */
148148
articleElem.innerHTML = article;
149149

150150
*!*
@@ -153,21 +153,21 @@ snippets.forEach(Prism.highlightElem);
153153
*/!*
154154
```
155155

156-
...Но представьте, что у нас есть много мест в коде, где мы загружаем что-либо: статьи, опросы, посты форумов. Нужно ли нам в каждый такой вызов добавлять `Prism.highlightElem`? Это не очень удобно, и легко забыть.
156+
...Но представьте, что у нас есть много мест в коде, где мы загружаем что-либо: статьи, опросы, посты форума. Нужно ли нам в каждый такой вызов добавлять `Prism.highlightElem`? Получится не очень удобно, а также можно легко забыть сделать это.
157157

158158
А что, если содержимое загружается вообще сторонним кодом? Например, у нас есть форум, написанный другим человеком, загружающий содержимое динамически, и нам захотелось добавить к нему выделение синтаксиса. Никто не любит править чужие скрипты.
159159

160160
К счастью, есть другой вариант.
161161

162162
Мы можем использовать `MutationObserver`, чтобы автоматически определять примеры кода, вставленные в страницу, и выделять их.
163163

164-
Так что весь функционал для подсветки синтаксиса будет в одном месте, мы будем избавлены от необходимости интегрировать его.
164+
Так что весь функционал для подсветки синтаксиса будет в одном месте, а мы будем избавлены от необходимости интегрировать его.
165165

166166
## Пример динамической подсветки синтаксиса
167167

168168
Вот работающий пример.
169169

170-
Если вы запустите этот код, он начнёт наблюдать за элементом ниже, подсвечивая код любого примера кода, который появляется там:
170+
Если вы запустите этот код, он начнёт наблюдать за элементом ниже, подсвечивая код любого примера, который появляется там:
171171

172172
```js run
173173
let observer = new MutationObserver(mutations => {
@@ -176,7 +176,7 @@ let observer = new MutationObserver(mutations => {
176176
// проверка новых узлов
177177

178178
for(let node of mutation.addedNodes) {
179-
// мы будем отслеживать только узлы-элементы, другие (текстовые) пропустить
179+
// мы будем отслеживать только узлы-элементы, другие (текстовые) пропускаем
180180
if (!(node instanceof HTMLElement)) continue;
181181

182182
// проверить, не является ли вставленный элемент примером кода
@@ -215,37 +215,37 @@ demoElem.innerHTML = `Фрагмент кода ниже:
215215
`;
216216
```
217217

218-
Теперь у нас есть `MutationObserver`, который может отслеживать все выделения в наблюдаемых элементах или во всём документе. Мы можем добавлять/удалять фрагменты кода в HTML, не задумываясь об их подсветке.
218+
Теперь у нас есть `MutationObserver`, который может отслеживать вставку кода в наблюдаемых элементах или во всём документе. Мы можем добавлять/удалять фрагменты кода в HTML, не задумываясь об их подсветке.
219219

220220
## Дополнительные методы
221221

222-
Есть метод для остановки наблюдения за узлами:
222+
Есть метод для остановки наблюдения за узлом:
223223

224224
- `observer.disconnect()` -- останавливает наблюдение.
225225

226-
К тому же:
226+
Кроме того:
227227

228228
- `mutationRecords = observer.takeRecords()` -- получает список необработанных записей изменений, которые произошли, но колбэк для них ещё не выполнился.
229229

230230
```js
231-
// мы отключаем наблюдатель
232-
// он возможно не успел обработать некоторые изменения
231+
// мы отключаем наблюдатель
232+
// он, возможно, не успел обработать некоторые изменения
233233
let mutationRecords = observer.takeRecords();
234234
// обработать mutationRecords
235235

236236
// теперь всё выполнилось, отключить
237237
observer.disconnect();
238238
```
239239

240-
## Сбор мусора
240+
## Сборка мусора
241241

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 и больше недостижим, то он будет удалён из памяти вне зависимости от наличия наблюдателя.
243243

244244

245245
## Итого
246246

247-
`MutationObserver` может реагировать на изменения в DOM: атрибуты, добавленные/удалённые элементы, содержание текста.
247+
`MutationObserver` может реагировать на изменения в DOM: атрибуты, добавленные/удалённые элементы, текстовое содержимое.
248248

249-
Мы можем использовать его, чтобы отслеживать изменения, внедрённые другими частями нашего собственного или чужого кода.
249+
Мы можем использовать его, чтобы отслеживать изменения, производимые другими частями нашего собственного или чужого кода.
250250

251-
Например, чтобы осуществить последующую обработку динамически вставленного содержимого, такого как пример `innerHTML`, выделенного на примере выше.
251+
Например, чтобы осуществить обработку (подсветку кода) динамически вставленного содержимого, как в демо выше с `innerHTML`.

0 commit comments

Comments
 (0)