class LiveTimer extends HTMLElement { render() { this.innerHTML = ` `; this.timerElem = this.firstElementChild; } connectedCallback() { // (2) if (!this.rendered) { this.render(); this.rendered = true; } this.timer = setInterval(() => this.update(), 1000); } update() { this.date = new Date(); this.timerElem.setAttribute('datetime', this.date); this.dispatchEvent(new CustomEvent('tick', { detail: this.date })); } disconnectedCallback() { clearInterval(this.timer); // important to let the element be garbage-collected } } customElements.define("live-timer", LiveTimer);