Похоже, у вас есть ошибки как в элементах, так и в this
Область (в <script>
)
const shadowRoot = this.attachShadow({mode: 'closed'}).appendChild(clone);
appendChild
- это ваш Немезид здесь.
Возвращает вставленный элемент ... не тень- root, а #document-fragment
(клонированный шаблон)
исправлено с:
const shadowRoot = this.attachShadow({mode: 'closed'});
shadowRoot.appendChild(clone);
Тогда:
mode:closed
будет не назначать this.shadowRoot
..
, которые вы можете не повторно использовать поскольку оно по-прежнему доступно только для чтения
с фиксированным значением:
this.Root = this.attachShadow({mode: 'closed'});
this.Root.appendChild(clone);
Теперь вы можете делать:
connectedCallback() {
this.Root.querySelector('#outside').innerHTML = 'Changed';
}
Я не понимаю, почему вы считаете, что не идеально
this.Root
доступно из всех / любых методов внутри Компонент
Хороший ресурс для всех DOM методы: https://javascript.info/modifying-document
<script>
внутри <template>
(эта область)
<template id='hello-world-template'>
<span id='inside'>Unchanged</span>
<script>
document.querySelector('#inside').innerHTML = 'Changed';
// Ideal, but does not work - no such element
</script>
</template>
Вы внедрили шаблон в компонент
document
может не элементы доступа внутри любой компонент shadowDOM
делает не имеет значения, является ли shadowDOM mode:closed
или mode:open
<script>
область будет window
(так как ему не была назначена область)
(я не думаю, что вы можете установить область действия this для сценария)
Чтобы получить область действия Component внутри этого <script>
, вы должны быть творческими ..
и используйте ваш img onload=
'hack'
С onload
на элементе <style>
делает его немного менее взломанным (IMHO)
<template id='hello-world-template'>
<span id='inside'>Inside Unchanged,</span>
<script>
function templFunc() {
// this scope is the shadowRoot, not the component!
this.querySelector('#inside').innerHTML = 'Changed';
}
</script>
<style onload="templFunc.apply(this.getRootNode())">
#inside{
color:green;
}
</style>
</template>
один основная проблема: будет выполняться только для первого использованного <hello-world>
элемента !!
Я не написал это из макушки головы,
(Работа в процессе) JSFiddle детская площадка (также показ ссылки на Компонент методы ) по адресу:
https://jsfiddle.net/CustomElementsExamples/zpamx728/
Обновление # 1
Хром (Edge / Chrome) ) и Opera в порядке, FireFox v72.0.2
плохо себя ведет:
onload
на элементе <STYLE>
будет срабатывать только для первого элемента
Я изменил JSFiddle, чтобы использовать ваш первый взлом, используя <img>
, и он запускается для каждого элемента
templFunc()
загружается / ограничивается в shadowDOM, поэтому может вызываться из методов компонента (см. JSFiddle)
, но .. только в FireFox НЕ определено / доступно для первого элемента
На данный момент я считаю, что эта ошибка FireFox ... будет расследовать дальше ... (смело go где. ..)
!!! Обновление № 2 !!!
Упс! Поиграл еще с этим.
Оказывается, все переменные и функции из клонированного и импортированного сценария
подняты в глобальную window
область действия
Так что приведенный выше код работает, но имеет основной побочный эффект ...
Вот почему FireFox жалуется на повторное объявление let
переменных