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
То есть, jQuery проверяет, находится ли элемент внутри своего документа. Если нет -- оно считает, что элемент не в DOM, и его размеры равны нулю.
275
+
То есть, jQuery проверяет, находится ли элемент `elem`внутри своего документа`elem.ownerDocument`. Если нет -- то считается, что элемент вне DOM, и его размеры равны нулю.
276
276
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`!
278
280
279
281
Получилось, что элемент не в документе и одновременно он имеет размеры. Такого разработчики jQuery не предусмотрели.
Поэтому на самом деле `document.contains(elem)` следовало бы возвращать `true`.
286
288
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`.**
288
292
289
-
Это один из тех небольших, но важных нюансов, которые показывают, почему стандарты всё ещё в разработке.
293
+
Это один из тех небольших, но важных нюансов, которые показывают, что стандарты всё ещё в разработке.
0 commit comments