如何从链接的JavaScript文件中访问自定义元素?

时间:2017-08-19 14:25:41

标签: javascript web-component custom-element html5-template

如果我有这样的剧本

<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 个答案:

答案 0 :(得分:1)

您不能按照this thread中的说明执行此操作:currentScript属性将返回null

相反,您应该在<template>之外加载脚本,并从自定义元素回调connectedCallback()constructor()调用脚本中定义的函数。

答案 1 :(得分:0)

您必须在组件外部访问currentScript。我用这个:

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

我使用(document.currentScript||document._currentScript)处理polyfills。

然后在你的构造函数中使用:

const instance = frag.cloneNode(true);

此时fragdocument-fragment,可以包含任意数量的子项。所有这些都将通过调用cloneNode来复制,以便Web组件的每个实例都有自己的DOM副本。