document.currentScript
contains a link to a script that is currently being processed and executed. Therefore, it is no longer valid for your purpose when the constructor()
function is called (from another script).
Instead, you shoud store its value in a variable at the beginning of the script and use this variable in the constructor:
<script> var currentScript = document.currentScript customElements.define( ... ) ... </script>
If you have multiple scripts, you must use different names.
Alternatively, you can encapsulate an ephemeral value in closure:
(function(owner) { customElements.define('app-container', class extends HTMLElement { constructor() { super(); let shadowRoot = this.attachShadow({ mode: 'open' }); const content = owner.querySelector('#app-container').content; shadowRoot.appendChild(content.cloneNode(true)); } }); })(document.currentScript.ownerDocument);
Here, the value of document.currentScript.ownerDocument
assigned to the owner
argument, which is still defined correctly when constructor()
called.
owner
defined locally, so you can use the same name in another document.
source share