рд╡реЗрдм рдШрдЯрдХ рдШрдЯрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИрдВред рдЙрди рд╕рднреА рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЙрдиреНрд╣реЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 11 рдХреЗ рд╕рд╛рде, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреИрд░рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж, рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдЕрдиреБрднрд╡реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рднреА рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреНрд░реЛрдо рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╢рд╛рдпрдж рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рднреА рдирд╣реАрдВ рд╣реИрдВред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕ рдкрд░ рдЬрд╛рдПрдВред
mkdir mywebcomp cd mywebcomp
рдкреВрд░рд╛ рд╣реБрдЖ:
npm init
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдХрд░ред
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ
index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
<html lang="en"> <body> </body> </html>
рдХрд┐рд╕реА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреИрдЧ рдЬреЛрдбрд╝реЗрдВ, рдирд╛рдо рдореЗрдВ рдПрдХ рд╣рд╛рдЗрдлрд╝рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ CusomElements рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдЗрд╕ рддрддреНрд╡ рдХреЛ рдорд╛рдирдХ рд▓реЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
<html lang="en"> <body> <my-webcomp></my-webcomp> </body> </html>
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝реЗрдВред
<script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { this.insertAdjacentHTML('beforeEnd', `<div>Hello</div>`) } } customElements.define('my-webcomp', MyWebComp); </script>
рдореЙрдбреНрдпреВрд▓рд░
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдирдИ рдХрдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ
customElements.define () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрд╕реЗ
my-webcomp рдЯреИрдЧ рдХреЗ рдкреАрдЫреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдФрд░
рдХрдиреЗрдХреНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ () рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝рдХрд░, рд╣рдордиреЗ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреЗрдбрд╝ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЗрд╕рдХреА рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХреАред рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рд╣рд╛рд▓рд╛рдВрдХрд┐, HTML рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рд░рдЦрдирд╛, рдпрджрд┐ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддреЛ рдЖрдо рддреМрд░ рдкрд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЬрдм рдЯреБрдХрдбрд╝реЗ рдПрдХ рд╕рднреНрдп рдЖрдХрд╛рд░ рдореЗрдВ рдмрдврд╝рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 20 рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рд░реНрдо рдкрд░, рдЬреЛ рдХрд┐ рд╕рдм-рдХрдорд░реНрд╕ рдХреЛ рд╣рд░рд╛ рджреЗрдирд╛ рднреА рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдмрд┐рдЫрд╛рдПрдВрдЧреЗ, рдЬреЛ рдЙрд╕реА рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХреБрдЫ рднреА рдЗрд╕реЗ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ред
<html lang="en"> <body> <template id="myWebCompTemplate"> <div>Hello</div> </template> <my-webcomp></my-webcomp> <script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let tplEl = document.querySelector('#myWebCompTemplate'); let html = document.importNode(tplEl.content, true); this.appendChild(html); } } customElements.define('my-webcomp', MyWebComp); </script> </body> </html>
рдШрдЯрдХ рдХреЛрдб рдореЗрдВ, рд╣рдордиреЗ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ html рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЖрдпрд╛рдд рдпрд╛рдиреА рдЗрд╕ рддрддреНрд╡ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдирд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЬреЛрдбрд╝рдирд╛ред
рдЖрдИрдбреА рдХрд╛ рдирд╛рдо рдХреИрдорд▓рдХреЗрд╕ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рд╛рдЗрдлрд╝рди рдпрд╛ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рддреНрд░реЛрдВ рддрдХ рдЙрдирдХреА рдкрд╣реБрдБрдЪ рдХрдо рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╛рдиреА рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:
let tplEl = document.querySelector('#myWebCompTemplate'); let html = document.importNode(tplEl.content, true);
рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
let html = document.importNode(myWebCompTemplate.content, true);
рдФрд░ рдпрд╣ рдХреЛрдб рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рддрддреНрд╡ рдХреЛ рдПрдХ рдЖрдИрдбреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд╣реАрдВ рд╕реЗ рднреА рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ рдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
<my-webcomp id="myWebComp"></my-webcomp> <script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let html = document.importNode(myWebCompTemplate.content, true); this.appendChild(html); } } customElements.define('my-webcomp', MyWebComp); </script> <script type="module"> myWebComp.showMessage(); </script>
рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдкреЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдЕрд▓рд░реНрдЯ рддреБрд░рдВрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд▓рдЯрдХрд╛рдПрдВрдЧреЗ рдЬреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
<my-webcomp id="myWebComp" onclick="this.showMessage(event)"></my-webcomp> <script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let html = document.importNode(myWebCompTemplate.content, true); this.appendChild(html); } showMessage(event) { alert("This is the message"); console.log(event); } } customElements.define('my-webcomp', MyWebComp); </script>
рдЕрдм, рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреАред
ShowMessage () рдкрджреНрдзрддрд┐ рдХрд╛ рддрд░реНрдХ рднреА рдПрдХ
рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдИрд╡реЗрдВрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХреНрд▓рд┐рдХ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдпрд╛ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХред
рдЕрдХреНрд╕рд░, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреВрдареЗ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рддрддреНрд╡ рдХрд╛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ
- рдЕрд▓рдЧ
рдЕрднрд┐рд╡рд╛рджрди-рдирд╛рдо рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рддрддреНрд╡ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
<my-webcomp id="myWebComp" greet-name="John" onclick="this.showMessage(event)"></my-webcomp> <my-webcomp id="myWebComp2" greet-name="Josh" onclick="this.showMessage(event)"></my-webcomp> <script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let html = document.importNode(myWebCompTemplate.content, true); this.appendChild(html); } showMessage(event) { alert("This is the message " + this.getAttribute('greet-name')); console.log(event); } } customElements.define('my-webcomp', MyWebComp); </script>
рдЕрдм, рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рдпрд╣ рдЬреЙрди рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рд╣реИ" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░реЗ рдкрд░ "рдпрд╣ рдЬреЛрд╢ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рд╣реИ"ред
рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЯрд╛рд░рдЧреЗрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреЙрдкреА рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдПрдкреАрдЖрдИ рд╕реЗ рд╡реИрд▓реНрдпреВ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред
<template id="myWebCompTemplate"> <div id="helloLabel">Hello</div> </template> <my-webcomp id="myWebComp" greet-name="John" onclick="this.showMessage(event)"></my-webcomp> <my-webcomp id="myWebComp2" greet-name="Josh" onclick="this.showMessage(event)"></my-webcomp> <script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let html = document.importNode(myWebCompTemplate.content, true); this.appendChild(html); this.querySelector('#helloLabel').textContent += ' ' + this.getAttribute('greet-name'); } showMessage(event) { alert("This is the message " + this.getAttribute('greet-name')); console.log(event); } } customElements.define('my-webcomp', MyWebComp); </script>
рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:
.TextContent рдХреЗ рдмрдЬрд╛рдп
рдпрд╣ .innerHTML рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдк рдЙрд╕реА
рд╢реБрд░реБрдЖрдд рдореЗрдВ .insertAdjacentHTML () рд╡рд┐рдзрд┐ рдХрд╛
рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред
рд▓рдВрдмреЗ рд╕рдордп рддрдХ, рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреБрд░рд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдкрд░ рдЙрдиреНрд╣реЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рддрдХрдиреАрдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдбрд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддрддреНрд╡ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
this.attachShadow({mode: 'open'});
рдЕрдм рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА DOM рдХреЙрд▓реНрд╕ рдХреЛ рдЗрд╕ рдХреЗ рд╕рд╛рде
рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рд╢рд╛рджреЛрдЙрд░реВрдЯ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд╣реАрдВ рд╣реИрдВред
<script type="module"> class MyWebComp extends HTMLElement { connectedCallback() { let html = document.importNode(myWebCompTemplate.content, true); this.attachShadow({mode: 'open'}); this.shadowRoot.appendChild(html); this.shadowRoot.querySelector('#helloLabel').textContent += ' ' + this.getAttribute('greet-name'); } showMessage(event) { alert("This is the message " + this.getAttribute('greet-name')); console.log(event); } } customElements.define('my-webcomp', MyWebComp); </script>
рдиреЗрддреНрд░рд╣реАрди, рдЗрд╕ рдХреЛрдб рдХрд╛ рдХрд╛рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдХреЛрдИ рднреА рд╣реЗрд▓реНрд▓реЛрдмрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рддрддреНрд╡ рд╣реИрдВред рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
myWebComp.shadowRoot.getElementById('helloLabel');
рдФрд░ рдлрд┐рд░ рдпрджрд┐ рдЖрдк
.attachShadow () рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╛рд╕ рдХрд░рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдорд┐рд▓реЗ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдирд╛ рднреА рдмрд╣реБрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо
my-webcomp.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЖрдпрд╛рдд рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
<script type="module"> import { MyWebComp } from "./my-webcomp.js"; customElements.define('my-webcomp', MyWebComp); myWebComp.shadowRoot.getElementById('helloLabel'); </script>
рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ .js рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди HTML рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореЙрдбреНрдпреВрд▓рд░ рдФрд░ рдШрдЯрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рд┐рд╕реНрдЯрдо рдореЙрдбреНрдпреВрд▓рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рдореЗрдВ
index.html рдЦреЛрд▓рдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдиреЛрдбрдЬ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
npm i http-server -g
рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ http-server рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдпрд╣ рд╣реЛрд╕реНрдЯ рдФрд░ рдкреЛрд░реНрдЯ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреЗрдЬ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ
http://127.0.0.1:8080
рдЬреЛ рдЕрдм рд╣рдорд╛рд░реЗ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧ рдкреЗрдЬ рдХрд╛ рдкрддрд╛ рд╣реЛрдЧрд╛ред
рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡реЗ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдХреЛрдб рдХреЛ рдХрд╛рдо рдореЗрдВ рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдореЛрдб рдореЗрдВ рдореЛрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВред
npm i mocha chai wct-mocha --save-dev
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд all.html рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:
<!doctype html> <html> <head> <meta charset="utf-8"> <script src="../node_modules/mocha/mocha.js"></script> <script src="../node_modules/chai/chai.js"></script> <script src="../node_modules/wct-mocha/wct-mocha.js"></script> </head> <body> <script> WCT.loadSuites([ 'my-webcomp.tests.html', ]); </script> </body> </html>
рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ
index.html рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
/ рдЗрд╕реЗ
my-webcomp.tests.html рдирд╛рдо
рджреЗрдВ рдФрд░
рд╕рднреА html рдореЗрдВ рдПрдХ рд╣реА рд╣реЗрдб рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝реЗрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдм рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдВрдн рдФрд░ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
<script type="module"> import { MyWebComp } from "../my-webcomp.js"; customElements.define('my-webcomp', MyWebComp); suite('MyWebComp', () => { test('is MyWebComp', () => { const element = document.getElementById('myWebComp'); chai.assert.instanceOf(element, MyWebComp); }); }); </script>
рдЕрдм рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп
http://127.0.0.1:8080/test/all.html
рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
sudo npm install --global web-component-tester --unsafe-perm
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛рдПрдВ:
wct --npm
рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ
package.json рдлрд╝рд╛рдЗрд▓ рдХреЗ
рдкрд░реАрдХреНрд╖рдг рдЦрдВрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
npm test

рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ
рд╕реБрдЗрдЯрд╕реЗрдЯ () рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
suiteSetup(() => { });
рд╕реБрдЗрдЯ рдХреЗ рдЕрдВрджрд░ред
рдпрд╣ рд╕рдВрднрд╡рддрдпрд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╣рдореЗрдВ рдХреБрдЫ рдиреНрдпреВрдирддрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд┐рд▓реА рд╣реИ рдХрд┐ рдпрджрд┐ рд╡рд╣ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╢рд░реНрдо рдирд╣реАрдВ рдЖрдПрдЧреАред
npm publish
рдпрд╛ рдХрдо рд╕реЗ рдХрдо
git push
рд╡рд┐рд╖рдп рдкрд░ рдЕрднреА рддрдХ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрд┐рддрд╛рдмреЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд▓реЗрдЦрди рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реЗрдм рдШрдЯрдХ, CustomElements, ShadowDOM, рдореВрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреИрдЧ, рдХрд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА:
https://bitbucket.org/techminded/mywebcomp рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╖рдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛
рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА
рд╣реИ