Baseline 2024 ใง่ฟฝๅ ใใใใใใใพใง JavaScript ใใใใ็ๆใงใใชใใฃใ Shadow DOM ใ HTML ใงๅฎ็พฉใงใใใใใซใชใๆฉ่ฝใงใใใใใซใใฃใฆใWeb Components ใใตใผใใผใตใคใใงใฎใฌใณใใชใณใฐใซๅฏพๅฟใใใใใจใใงใใพใใ
ๆฌกใฎใใใช HTML ใจใใฆ่จ่ฟฐใใใใจใง Shadow DOM ใ็ๆใใใพใใ(ๅไฝใตใณใใซ)
<my-custom-element data-count="12345">
<template shadowrootmode="open">
<style>
* {
margin: 0;
padding: 0;
}
.container {
display: flex;
gap: 8px;
}
.counter {
font-weight: bold;
}
.increment, .decrement {
width: 20px;
cursor: pointer;
}
</style>
<div class="container">
<p class="counter">12345</p>
<button class="increment">+</button>
<button class="decrement">-</button>
</div>
</template>
</my-custom-element>
ๅๅใง customElements.define ใใใ HTMLElement ใใใใฐใ่ชๅ็ใซใขใใใใผใใใใ constructor ใ connectedCallback ใง Hydration ใ่กใใใจใใงใใพใใ
class MyCustomElement extends HTMLElement {
connectedCallback() {
let count = parseInt(this.getAttribute('data-count'))
this.shadowRoot.querySelector('.increment').addEventListener('click', () => {
this.shadowRoot.querySelector('.counter').textContent = String(++count)
})
this.shadowRoot.querySelector('.decrement').addEventListener('click', () => {
this.shadowRoot.querySelector('.counter').textContent = String(--count)
})
}
}
customElements.define("my-custom-element", MyCustomElement);
Declarative Shadow DOM ใฎๅฝขใง JavaScript ใใ่ฆ็ด ใ่ฟฝๅ ใใๅ ดๅใ $el.innerHTML = htmlString ใงใฏใปใญใฅใชใใฃไธใฎ็็ฑใใๅฎ่กใ่กใใใใไปฃใใใซ setHTMLUnsafe ใ parseHTMLUnsafe ใๅฉ็จใใๅฟ
่ฆใใใใพใใ