"Custom Elements" is a web component specification that defines how to create and use new types of DOM elements. There are some basic rules on how to name and define your custom elements. They are:
- The name of your custom widget must contain a Dash (-) . For example,
<file-reader>
and <skype-login>
are valid names for custom elements, while <skype_login>
and <skypelogin>
are not. This is necessary to allow the HTML parser to differentiate between a custom element and an embedded HTML element.
- A custom element cannot be registered more than once. A
DOMException
error will be released if you do this.
- A custom element cannot be auto-closed. For example, you cannot write a custom element like this:
<skype-login />
.It should always be written like this: <skype-login></skype-login>
.
A custom element can be created using customElements.define()
browser API method and a class that extends HTMLElement
in Javascript, like this:
class ErickPrates extends HTMLElement {
// Definir comportamento aqui
}
window.customElements.define('Erick-Prates', ErickPrates);
Another option is to use an anonymous class like this:
window.customElements.define('Erick-Prates', class extends HTMLElement {
// Definir comportamento aqui
});
With this already set, you can now use the custom element on a web page, thus:
<Erick-Prates></Erick-Prates>
You can define properties in a Customelement. For example, let’s add an attribute called open
and to our <Erick-Prates>
element. This can be achieved thus:
class ErickPrates extends HTMLElement {
// Defina a propriedade "open"
set open(option) {
this.setAttribute("open", option);
}
// Obter a propriedade "open"
get open() {
return this.hasAttribute("open");
}
}
this refers to the DOM element itself. So, in this example, this refers to <Erick-Prates>
.
Once you have done this, you can now use the custom element in your browser like this:
<Erick-Prates open="true"></Erick-Prates>
You can also set a constructor in the class, but you should call the super()
method before adding any other code.
There are life cycle hooks that custom elements can define during their existence. These hooks are:
- builder (): Here, you can attach event listeners and initialize the status.
- connectedCallback (): Called whenever the custom element is inserted into the DOM.
- disconnected (): Called whenever the custom element is removed from the DOM.
- attributeChangedCallback (attrName, oldVal, newVal): Called whenever an attribute is added, removed or updated. Only attributes listed in the property observadaAttributes are affected.
- adopted (): Called whenever the custom element has been moved to a new document.
You can make reference to custom element specification for more information.
I had the same problem and it worked for me. Thanks! :)
– YanSym