如果我有这样的剧本
<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()
的自定义元素?
由于
答案 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);
此时frag
是document-fragment
,可以包含任意数量的子项。所有这些都将通过调用cloneNode
来复制,以便Web组件的每个实例都有自己的DOM副本。