mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-15 10:43:22 +00:00
32 lines
971 B
TypeScript
32 lines
971 B
TypeScript
|
/**
|
||
|
* Safari doesn't support inheriting from HTML tags on web components
|
||
|
* The technique is to:
|
||
|
* create a new web component
|
||
|
* create the desired type inside
|
||
|
* pass all attributes to the child component
|
||
|
* store is at as a widget inside the parent
|
||
|
*
|
||
|
* To use this, you must use the tag name twice, once for creating the class
|
||
|
* and the second time while calling super to pass it to the constructor
|
||
|
**/
|
||
|
export class InheritedComponent<
|
||
|
K extends keyof HTMLElementTagNameMap,
|
||
|
> extends HTMLElement {
|
||
|
widget: HTMLElementTagNameMap[K];
|
||
|
|
||
|
constructor(tagName: K) {
|
||
|
super();
|
||
|
this.widget = document.createElement(tagName);
|
||
|
const attributes: Attr[] = []; // We need to make a copy to delete while iterating
|
||
|
for (const attr of this.attributes) {
|
||
|
attributes.push(attr);
|
||
|
}
|
||
|
|
||
|
for (const attr of attributes) {
|
||
|
this.removeAttributeNode(attr);
|
||
|
this.widget.setAttributeNode(attr);
|
||
|
}
|
||
|
this.appendChild(this.widget);
|
||
|
}
|
||
|
}
|