Как получить доступ к пользовательскому элементу из связанного файла JavaScript?

Если бы у меня был такой скрипт

<template id="x-foo-from-template">
    <script src="/js/main.js"></script>
</template>

<script>
    customElements.define('my-header', class extends HTMLElement {
        constructor() {
            super();
            let shadowRoot = this.attachShadow({mode: 'open'});
            const t = document.currentScript.ownerDocument.querySelector('#x-foo-from-template');
            const instance = t.content.cloneNode(true);
            shadowRoot.appendChild(instance);

            // set up title
            var title = this.getAttribute("title");
            var div = document.createElement("div");
            div.innerText = title;
            shadowRoot.appendChild(div);
        }
    });
</script>

Изнутри main.js как я могу получить доступ к пользовательскому элементу, который эквивалентен this в constructor()?

Спасибо

2 ответа

Вы не можете сделать это, как описано в этой теме: currentScript собственность вернется null,

Вместо этого вы должны загрузить скрипт за пределами <template>и вызовите функцию, определенную в скрипте, из ваших пользовательских обратных вызовов connectedCallback() или же constructor(),

Вы должны получить доступ currentScript вне компонента. Я использую это:

var frag = (document.currentScript||document._currentScript).ownerDocument.querySelector('template').content;

я использую (document.currentScript||document._currentScript) обрабатывать полифилы.

Тогда в вашем конструкторе вы будете использовать:

const instance = frag.cloneNode(true);

С этой точки зрения frag это document-fragment и может содержать любое количество детей. Все они будут воспроизведены при обращении к cloneNode так что каждый экземпляр вашего веб-компонента имеет свою собственную копию DOM.

Другие вопросы по тегам