- From: edbaafi <notifications@github.com>
- Date: Tue, 25 Feb 2025 15:22:00 -0800
- To: WICG/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <WICG/webcomponents/issues/645/2683511090@github.com>
edbaafi left a comment (WICG/webcomponents#645)
@matthewp Are you talking about in the rollup plugin? Yeah I hadn't thought about it as I don't need that for my use case (I am bundling StyleSheets included using `@import` from the CSS imports though which is currently out of spec IIRC). But I guess what you're referring to is that scripts added to templates with innerHTML will not load and were wondering if we could get around that with build tools?
```
const html = document.createElement('template');
html.innerHTML = `
<script>
alert('Without a patch, scripts cannot loaded from templates set with innerHTML');
</script>
<span>Shadow Content</span>
`;
class TestTemplateScripts extends HTMLElement {
#shadowRoot;
constructor() {
super();
this.#shadowRoot = this.attachShadow({ mode: 'closed' });
this.#shadowRoot.appendChild(html.content.cloneNode(true));
}
}
customElements.define('test-template-scripts', TestTemplateScripts);
```
In any case this limitation can be overcome with the following (all the semantics questions aside) so we could do this in the bundler and export a template where scripts do work:
```
const createTemplate = (innerHTML) => {
const template = document.createElement('template');
template.innerHTML = innerHTML;
const scripts = template.content.querySelectorAll('script');
for (const script of scripts) {
// Scripts created with cloneNode() won't load, so create the script
// element and then copy the text content and attributes manually
const newScript = document.createElement('script');
for (const attributeName of script.getAttributeNames()) {
newScript.setAttribute(attributeName, script.getAttribute(attributeName));
}
newScript.textContent = script.textContent;
// Avoid replaceWith for legacy engine support
script.parentNode.insertBefore(newScript, script);
script.parentNode.removeChild(script);
}
return template;
}
const html = createTemplate(`
<script>
alert('With this patch, scripts can now be loaded from templates set with innerHTML');
</script>
<span>Shadow Content</span>
`);
```
<img width="1083" alt="Image" src="https://github.com/user-attachments/assets/d38fde44-9ca3-4cdc-881b-01fb6482e12e" />
--
Reply to this email directly or view it on GitHub:
https://github.com/WICG/webcomponents/issues/645#issuecomment-2683511090
You are receiving this because you are subscribed to this thread.
Message ID: <WICG/webcomponents/issues/645/2683511090@github.com>
Received on Tuesday, 25 February 2025 23:22:04 UTC