Skip to content

Commit 87fd7b6

Browse files
committed
improvement
1 parent c5e85f8 commit 87fd7b6

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

3-webcomponents/7-webcomponent-build/article.md

+8-4
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,11 @@ if(!jQuery.contains(elem.ownerDocument, elem)) {
272272
}
273273
```
274274

275-
То есть, jQuery проверяет, находится ли элемент внутри своего документа. Если нет -- оно считает, что элемент не в DOM, и его размеры равны нулю.
275+
То есть, jQuery проверяет, находится ли элемент `elem` внутри своего документа `elem.ownerDocument`. Если нет -- то считается, что элемент вне DOM, и его размеры равны нулю.
276276

277-
**Но в случае с Shadow DOM элемент как раз *не* лежит в `document`. Вызов `document.contains(elem)` вернёт `false`!**
277+
Если копнуть чуть глубже, то `jQuery.contains` в современных браузерах сводится к обычному вызову [contains](https://developer.mozilla.org/en-US/docs/Web/API/Node/contains).
278+
279+
Парадокс с Shadow DOM заключается в том, что вызов `elem.ownerDocument.contains(elem)` вернёт `false`!
278280

279281
Получилось, что элемент не в документе и одновременно он имеет размеры. Такого разработчики jQuery не предусмотрели.
280282

@@ -284,9 +286,11 @@ if(!jQuery.contains(elem.ownerDocument, elem)) {
284286

285287
Поэтому на самом деле `document.contains(elem)` следовало бы возвращать `true`.
286288

287-
Почему же `false`? Причина проста -- описанный в [другом стандарте](http://www.w3.org/TR/dom/#dom-node-contains) механизм работы `contains` по сути состоит в проходе вверх от `elem` по цепочке `parentNode`, пока либо встретим искомый элемент, тогда ответ `true`, а иначе `false`. В случае с Shadow DOM этот путь закончится на корне Shadow DOM-дерева, оно ведь не является потомком хозяина. Метод `contains` не знает ничего про саму возможность Shadow DOM, поэтому и выходит, что результат `false`.
289+
Почему же `false`? Причина проста -- описанный в [другом стандарте](http://www.w3.org/TR/dom/#dom-node-contains) механизм работы `contains` по сути состоит в проходе вверх от `elem` по цепочке `parentNode`, пока либо встретим искомый элемент, тогда ответ `true`, а иначе `false`. В случае с Shadow DOM этот путь закончится на корне Shadow DOM-дерева, оно ведь не является потомком хозяина.
290+
291+
**Метод `contains` описан стандартом без учёта Shadow DOM, поэтому возвратил неверный результат `false`.**
288292

289-
Это один из тех небольших, но важных нюансов, которые показывают, почему стандарты всё ещё в разработке.
293+
Это один из тех небольших, но важных нюансов, которые показывают, что стандарты всё ещё в разработке.
290294

291295
## Итого
292296

0 commit comments

Comments
 (0)