8-web-components/7-shadow-dom-events#222
Conversation
|
Добрый день, предлагаю вариант перевода статьи. Хочу отметить, что статья насыщена терминами, которые, я думаю, требуют уточнения. Пожалуйста, обратите на это особое внимание при ревью. =) Например, такие как: |
xcurveballx
left a comment
There was a problem hiding this comment.
Да, сложный материал. Как вариант, я предлагаю в самом начале статьи выписать термины с переводом/объяснением, о чем речь, а в статье уже использовать Shadow DOM, Flattened DOM и т.д. Это не совсем перевод будет, а скорее доработка контента. Иначе смысла не много на самом деле. Если пытаться везде по тексту использовать переведенные версии терминов, то у читателей будет каша. Лично я читал, открыв пару англоязычных статей параллельно, чтобы понять, о чем речь идёт.
|
Please make the requested changes. After it, add a comment "/done". |
|
Please make the requested changes. After it, add a comment "/done". |
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
Co-Authored-By: Alexey Pyltsyn <lex61rus@gmail.com>
|
Благодарю за правки =) /done |
| ``` | ||
|
|
||
| If a click happens on `"John Smith"`, for both inner and outer handlers the target is `<span slot="username">`. That's an element from the light DOM, so no retargeting. | ||
| Если клик произойдёт на `"John Smith"`, то для обоих обработчиков -- внутреннего и внешнего -- целевым элементом будет `<span slot="username">`. Это элемент обычного ("светлого") DOM, так что подмены не происходит. |
There was a problem hiding this comment.
А вот кстати интересный вопрос - в этом контексте light - это светлый (как оппозиция теневому) или лёгкий (отражает идею, что в него входят только элементы внутри компонента)?
There was a problem hiding this comment.
Светлый. Посмотри предыдущие переводы по терминологии мб? Там обсуждали
There was a problem hiding this comment.
Плиз убери кавычки вокруг "светлый" везде.
А то теневой-то без кавычек =)
iliakan
left a comment
There was a problem hiding this comment.
Спасибо! Пожалуйста, внеси изменения, ряд изменений напрямую меняет смысл, они важные.
Хорошо бы во всём разделе про Shadow DOM использовать одинаковые термины, в частности flattened -> развёрнутый.
| # Теневой DOM и события | ||
|
|
||
| The idea behind shadow tree is to encapsulate internal implementation details of a component. | ||
| Идея, стоящая за теневым DOM-деревом -- это инкапсуляция реализации внутренних деталей компонента. |
There was a problem hiding this comment.
Смысл создания теневого DOM-дерева - это инкапсуляция внутренних деталей компонента.
| Идея, стоящая за теневым DOM-деревом -- это инкапсуляция реализации внутренних деталей компонента. | ||
|
|
||
| Let's say, a click event happens inside a shadow DOM of `<user-card>` component. But scripts in the main document have no idea about the shadow DOM internals, especially if the component comes from a 3rd-party library or so. | ||
| Допустим, клик произошёл внутри теневого DOM на компоненте `<user-card>`. Но скрипты основного документа ничего не знают о внутреннем устройстве теневой DOM-структуры, в особенности, если компонент из кода сторонней библиотеки или вроде того. |
There was a problem hiding this comment.
если компонент из кода сторонней библиотеки или вроде того -> если компонент создан сторонней библиотекой
| Допустим, клик произошёл внутри теневого DOM на компоненте `<user-card>`. Но скрипты основного документа ничего не знают о внутреннем устройстве теневой DOM-структуры, в особенности, если компонент из кода сторонней библиотеки или вроде того. | ||
|
|
||
| So, to keep things simple, the browser *retargets* the event. | ||
| Таким образом, чтобы не усложнять, браузер *меняет у этого события целевой элемент*. |
There was a problem hiding this comment.
Поэтому, чтобы не нарушать инкапсуляцию, браузер меняет у этого события целевой элемент.
| Таким образом, чтобы не усложнять, браузер *меняет у этого события целевой элемент*. | ||
|
|
||
| **Events that happen in shadow DOM have the host element as the target, when caught outside of the component.** | ||
| **События, которые пойманы в теневом DOM, но вне компонента, имеют в качестве целевого элемента -- элемент-хозяин.** |
There was a problem hiding this comment.
События, которые произошли в теневом DOM, но пойманы снаружи этого DOM, имеют элемент-хозяин в качестве целевого элемента event.target.
| Хорошо, что браузер подменяет целевые элементы событий. Потому что внешний документ ничего не знает о внутреннем устройстве компонента. С его (внешнего документа) точки зрения, событие происходит на `<user-card>`. | ||
|
|
||
| **Retargeting does not occur if the event occurs on a slotted element, that physically lives in the light DOM.** | ||
| **Подмена целевого элемента не происходит, если событие берёт начало на "слотовом" элементе, который фактически находится в обычном, "светлом" DOM.** |
There was a problem hiding this comment.
"слотовом" элементе -> элементе из слота
| ## Итого | ||
|
|
||
| Events only cross shadow DOM boundaries if their `composed` flag is set to `true`. | ||
| Только те события пересекают границы теневого DOM, чей флаг `composed` установлен в значение `true`. |
| Только те события пересекают границы теневого DOM, чей флаг `composed` установлен в значение `true`. | ||
|
|
||
| Built-in events mostly have `composed: true`, as described in the relevant specifications: | ||
| У большинства встроенных событий стоит `composed: true`, как и описано в соответствующих спецификациях: |
| У некоторых встроенных событий всё же стоит `composed: false`: | ||
|
|
||
| - `mouseenter`, `mouseleave` (also do not bubble), | ||
| - `mouseenter`, `mouseleave` (также не всплывают), |
| Эти события могут быть пойманы только на элементах, принадлежащих тому же DOM-дереву. | ||
|
|
||
| If we dispatch a `CustomEvent`, then we should explicitly set `composed: true`. | ||
| Если мы инициируем `CustomEvent`, то должны явно поставить флаг `composed: true`. |
There was a problem hiding this comment.
инициируем -> генерируем своё событие
| Если мы инициируем `CustomEvent`, то должны явно поставить флаг `composed: true`. | ||
|
|
||
| Please note that in case of nested components, composed events bubble through all shadow DOM boundaries. So, if an event is intended only for the immediate enclosing component, we can also dispatch it on the shadow host. Then it's out of the shadow DOM already. | ||
| Обратите внимание, что в случае вложенных компонентов, события с заданной композицией всплывают через границы всего теневого DOM. Поэтому, если событие предназначено только для непосредственного ближайшего компонента, то мы также должны инициировать это событие на элементе-хозяине. Иначе оно выйдет за пределы своего теневого DOM. |
There was a problem hiding this comment.
Обратите внимание, что в случае вложенных компонентов теневые DOM могут быть вложены друг в друга. События с флагом composed всплывают через границы всех теневых DOM. Поэтому, если событие предназначено только для ближайшего внешнего компонента-родителя, мы можем инициировать его на элементе-хозяине. Тогда оно будет уже вне теневого DOM компонента, но не выплывает наружу в "ещё более внешний" DOM.
|
Please make the requested changes. After it, add a comment "/done". |
|
@dandgerson Добрый день! Есть ли у вас возможность продолжить заниматься этим PR? |
|
/done |
|
🚀 |
No description provided.