ì¹ ì»´í¬ëí¸ íì¤ì 주ì ê¸°ë¥ ì¤ íëë ì¬ì©ì ì ì íì´ì§ 기ë¥ì ì ê³µíë ê¸¸ê³ ì¤ì²©ë ììë¤ì 묶ìì¼ë¡ ë§ì¡±íë ê²ë³´ë¤ë, HTML íì´ì§ìì 기ë¥ì 캡ìííë ì¬ì©ì ì ì ìì를 ìì±íë ë¥ë ¥ì ëë¤. ì´ ë¬¸ìë Custom Elements APIì ì¬ì©ì ìê°í©ëë¤.
ì¤ì ë´ì© ë³´ê¸°ì¹ documentì ì¬ì©ì ì ì ììì 컨í¸ë¡¤ë¬ë CustomElementRegistry
ê°ì²´ì
ëë¤. ì´ ê°ì²´ë íì´ì§ì ì¬ì©ì ì ì ìì를 ë±ë¡í ì ìê² íê³ , ì´ë¤ ì¬ì©ì ì ì ììê° ë±ë¡ëìëì§ ë±ì ëí ì 보를 ë°íí©ëë¤.
íì´ì§ì ì¬ì©ì ì ì ìì를 ë±ë¡íë ë°©ë²ì CustomElementRegistry.define()
ë©ìë를 ì¬ì©íë ê²ì
ëë¤. ì´ ë©ìëë ì¸ìë¡ ë¤ìì ì·¨í©ëë¤.
DOMString
ì ììì 주ë ì´ë¦ì ëíë
ëë¤. ì¬ì©ì ì ì ììì ì´ë¦ì ëìê° ì¬ì©ëë ê²ì ì구íë¤ë ê²ì 주ìíì¸ì (kebab-case). ì´ë¦ì íëì ë¨ì´ì¼ ì ììµëë¤.extends
ìì±ì í¬í¨íë ìµì
ê°ì²´ì¸ë°, ì´ë ì´ ììê° ììë°ë ë´ì¥ ììê° ìë¤ë©´, ê·¸ ë´ì¥ ìì를 ëª
ìí©ëë¤ (ì¤ì§ ì¬ì©ì ì ìë ë´ì¥ ìììë§ ê´ê³ììµëë¤. ìëì ì ì를 ë³´ì¸ì).ì를 ë¤ì´, ì¬ì©ì ì ì ë¨ì´ ì¹´ì´í¸ ìì를 ë¤ìê³¼ ê°ì´ ì ìí ì ììµëë¤.
customElements.define("word-count", WordCount, { extends: "p" });
ì´ ììë word-count
ë¼ê³ ë¶ë¦¬ë©°, ì´ê²ì í´ëì¤ ê°ì²´ë WordCount
ì´ê³ , ì´ê²ì <p>
ìì를 íì¥í©ëë¤.
ì¬ì©ì ì ì ììì í´ëì¤ ê°ì²´ë íì¤ ES 2015 class 구문ì ì¬ì©íì¬ ìì±ë©ëë¤. ì를 ë¤ì´, WordCount
ë ë¤ìê³¼ ê°ì´ 구조íë ì ììµëë¤.
class WordCount extends HTMLParagraphElement {
constructor() {
// íì super를 ìì±ììì 먼ì í¸ì¶í©ëë¤
super();
// ìì 기ë¥ì ì¬ê¸° ìì±ë©ëë¤
...
}
}
ì´ê²ì ë¨ìí ê°ë¨í ìì ì´ì§ë§, ì¬ê¸°ì í ì ìë ë ë§ì ê²ì´ ììµëë¤. í´ëì¤ ë´ë¶ìì í¹ì í ìëª
주기 ì½ë°±ì ì ìí ì ìëë°, ì´ ì½ë°±ì ììì ìëª
주기ì í¹ì í ì§ì ìì ì¤íë©ëë¤. ì를 ë¤ì´, connectedCallback
ì ì¬ì©ì ì ì ììê° ë¬¸ìì ì°ê²°ë ììì ì¶ê°ë ëë§ë¤ í¸ì¶ëë ë°ë©´, attributeChangedCallback
ì ì¬ì©ì ì ì ììì í¹ì± ì¤ íëê° ì¶ê°ëê±°ë, ì ê±°ëê±°ë, ë³ê²½ë ë í¸ì¶ë©ëë¤.
ìëì ìëª ì£¼ê¸° ì½ë°± ì¬ì©í기 ì¹ì ìì ë ë§ì ê²ì ë°°ì¸ ì ììµëë¤.
ë ì¢ ë¥ì ì¬ì©ì ì ì ììê° ììµëë¤.
<popup-info>
, í¹ì document.createElement("popup-info")
.is
í¹ì± (í¹ì ìì±) ì ì¬ì©ì ì ì ììì ì´ë¦ì ëª
ìí´ì¼ í©ëë¤. ì를 ë¤ì´ <p is="word-count">
, í¹ì document.createElement("p", { is: "word-count" })
.ì´ ì§ì ìì, ì´ë»ê² ì¬ì©ì ì ì ììê° ìì±ëëì§ë¥¼ ìì¸í ë³´ì¬ì£¼ë ëª ê°ì§ ê°ë¨í ìì 를 ì´í´ë´ ìë¤.
ë 립ì ì¸ ì¬ì©ì ì ì ììë
립ì ì¸ ì¬ì©ì ì ì ììì ìì 를 ì´í´ë´
ìë¤. <popup-info-box>
(ìë ìì ë ë³¼ ì ììµëë¤). ì´ê²ì ì´ë¯¸ì§ ìì´ì½ê³¼ í
ì¤í¸ 문ìì´ì ì·¨íê³ , ìì´ì½ì íì´ì§ì ë£ìµëë¤. ìì´ì½ì´ í¬ì»¤ì¤ëìì ë, ì´ê²ì í
ì¤í¸ë¥¼ íì
ì ë³´ ë°ì¤ì íìíì¬ ì¶ê°ì ì¸ ë§¥ë½ ë´ ì 보를 ì ê³µí©ëë¤.
ì°ì , JavaScript íì¼ìì PopUpInfo
ë¼ë í´ëì¤ë¥¼ ì ìíëë°, ì´ í´ëì¤ë í¬ê´ì ì¸ HTMLElement
í´ëì¤ë¥¼ íì¥í©ëë¤.
class PopUpInfo extends HTMLElement {
constructor() {
// íì super를 ìì±ììì 먼ì í¸ì¶í©ëë¤
super();
// ìì 기ë¥ì ì¬ê¸° ìì±í©ëë¤
...
}
}
ìì ì½ë ì¤ëí«ì í´ëì¤ì ëí constructor()
ì ì를 í¬í¨íê³ ìëë°, ì´ë íì super()
를 í¸ì¶í¨ì¼ë¡ì¨ ììíì¬ ì¬ë°ë¥¸ íë¡í íì
ì²´ì¸ì´ í립ëëë¡ í©ëë¤.
ìì±ì ë´ë¶ìì, í´ëì¤ì ì¸ì¤í´ì¤ê° ì¸ì¤í´ì¤íëìì ë ììê° ê°ì§ 모ë 기ë¥ì ì ìí©ëë¤. ì´ ê²½ì° ì°ë¦¬ë shadow rootì ì¬ì©ì ì ì ììì ë¶ì°©íê³ , ëª ê°ì§ DOM ì¡°ìì ì¬ì©íì¬ ììì ë´ë¶ shadow DOM 구조를 ìì±íëë°, ì´ë ê·¸ë¦¬ê³ ì shadow rootì ë¶ì°©ë©ëë¤. ê·¸ë¦¬ê³ ë§ì§ë§ì¼ë¡ ëª ê°ì§ CSS를 shadow rootì ë¶ì°©íì¬ shadow DOMì 꾸ë°ëë¤.
// shadow rootì ìì±í©ëë¤
this.attachShadow({ mode: "open" }); // 'this.shadowRoot'ì ì¤ì íê³ ë°íí©ëë¤
// (ì¤ì²©ë) span ììë¤ì ìì±í©ëë¤
const wrapper = document.createElement("span");
wrapper.setAttribute("class", "wrapper");
const icon = wrapper.appendChild(document.createElement("span"));
icon.setAttribute("class", "icon");
icon.setAttribute("tabindex", 0);
// ì ìë í¹ì±ì¼ë¡ë¶í°ì ìì´ì½ í¹ì 기본 ìì´ì½ì ì½ì
í©ëë¤
const img = icon.appendChild(document.createElement("img"));
img.src = this.hasAttribute("src")
? this.getAttribute("src")
: "img/default.png";
const info = wrapper.appendChild(document.createElement("span"));
info.setAttribute("class", "info");
// í¹ì±ì ë´ì©ì ì·¨íê³ ê·¸ê²ì info span ë´ë¶ì ë£ìµëë¤
info.textContent = this.getAttribute("data-text");
// shadow domì ì ì©í ëª ê°ì§ CSS를 ìì±í©ëë¤
const style = document.createElement("style");
style.textContent =
".wrapper {" +
// ê°ê²°í¨ì ìí´ CSS ìëµë¨
// ìì±ë ììë¤ì shadow DOMì ë¶ì°©í©ëë¤
this.shadowRoot.append(style, wrapper);
ë§ì§ë§ì¼ë¡, CustomElementRegistry
ì ì¬ì©ì ì ì ìì를 ììì ì¸ê¸ë define()
ë©ìë를 ì¬ì©í´ ë±ë¡í©ëë¤. 매ê°ë³ììì ììì ì´ë¦ê³¼, ê·¸ë¦¬ê³ ëì ììì 기ë¥ì ì ìíë í´ëì¤ëª
ì ëª
ìí©ëë¤.
customElements.define("popup-info", PopUpInfo);
ì´ ììë ì´ì íì´ì§ìì ì¬ì© ê°ë¥í©ëë¤. HTML ì ì²´ìì, ìì를 ë¤ìê³¼ ê°ì´ ì¬ì©í©ëë¤.
<popup-info
img="img/alt.png"
data-text="Your card validation code (CVC)
is an extra security feature â it is the last 3 or 4 numbers on the
back of your card."></popup-info>
ë´ë¶ ì¤íì¼ ë ì¸ë¶ ì¤íì¼ì°¸ê³ : ì ì²´ JavaScript ìì¤ ì½ë를 ì¬ê¸°ì íì¸í ì ììµëë¤.
ì기ì ìì ìì <style>
ììê° ì¬ì©ëì´ Shadow DOMì ì¤íì¼ì ì ì©íì¼ë, ëì <link>
ììë¡ë¶í° ì¸ë¶ ì¤íì¼ìí¸ë¥¼ 참조í¨ì¼ë¡ì¨ ì¤íì¼ì ì ì©íë ê²ë ìë²½í ê°ë¥í©ëë¤.
ì를 ë¤ìë©´, popup-info-box-external-stylesheet ìì ìì ì´ ì½ë를 íì¸í´ ë³´ì¸ì (ìì¤ ì½ëë ë³¼ ì ììµëë¤).
// ì¸ë¶ ì¤íì¼ì shadow domì ì ì©í기
const linkElem = document.createElement("link");
linkElem.setAttribute("rel", "stylesheet");
linkElem.setAttribute("href", "style.css");
// ìì±ë ìì를 shadow domì ë¶ì°©í기
shadow.appendChild(linkElem);
<link>
ììë shadow rootì íì¸í¸ë¥¼ ë§ì§ ìì, ì¤íì¼ìí¸ê° ë¡ë©ëë ëì ì¤íì¼ëì§ ìì ë´ì©ì ë²ì©ì (FOUC, flash of unstyled content) ì´ ìì ì ìë¤ë ì ì 주ìíì¸ì.
ë§ì 모ë ë¸ë¼ì°ì ë¤ì ê³µíµ ë
¸ëë¡ë¶í° ë³µì ëìê±°ë ëì¼í í
ì¤í¸ë¥¼ ê°ì§ê³ ìë <style>
íê·¸ì ëí ìµì í를 구ííì¬ ì¤íì¼ íê·¸ê° íëì ë°±ì
ì¤íì¼ìí¸ë¥¼ ê³µì í ì ìê² í©ëë¤. ì´ ìµì íë¡ ì¸í´ ì¸ë¶ ì¤íì¼ê³¼ ë´ë¶ ì¤íì¼ì ì±ë¥ì ë¹ì·í ê²ì
ëë¤.
ì´ì ì¬ì©ì ì ìë ìì ìì 를 ì´í´ë´ ìë¤. expanding-list (ìë ìì ë íì¸í´ ë³´ì¸ì). ì´ê²ì ì ë ¬ëì§ ìì 리ì¤í¸ë¥¼ íì¥/ì¶ì ë©ë´ë¡ ë°ê¿ ì¤ëë¤.
ì°ì , ììì í´ëì¤ë¥¼ ì´ì ê³¼ ê°ì ë°©ìì¼ë¡ ì ìí©ëë¤.
class ExpandingList extends HTMLUListElement {
constructor() {
// íì super를 ìì±ììì 먼ì í¸ì¶í©ëë¤
super();
// ìì 기ë¥ì ì¬ê¸° ìì±í©ëë¤
...
}
}
ìì 기ë¥ì ì¬ê¸°ìë ìì¸í ì¤ëª
íì§ ìì ê²ì´ì§ë§, ìì¤ ì½ë를 íì¸í´ì ì´ë»ê² ìëíëì§ ë°ê²¬í ì ìì ê²ì
ëë¤. ì¬ê¸°ìì ì°¨ì´ë ì´ ììê° HTMLElement
ê° ìëë¼, HTMLUListElement
ì¸í°íì´ì¤ë¥¼ íì¥íë¤ë ê²ì
ëë¤. ê·¸ëì ì´ ììë ë
립ë ììì´ê¸°ë³´ë¤ë <ul>
ììì 모ë í¹ì±ì ê°ì§ê³ ìì¼ë©° ê·¸ ìì ì°ë¦¬ê° ì ìí ê¸°ë¥ ëí ê°ì§ê³ ììµëë¤. ì´ê²ì´ ì´ ìì를 ë
립ì ì¸ ììë³´ë¤ë ì¬ì©ì ì ìë ë´ì¥ ììë¡ ë§ë¤ì´ì£¼ë ê²ì
ëë¤.
ë¤ìì¼ë¡, ì ê³¼ ê°ì´ define()
ë©ìë를 ì¬ì©íì¬ ìì를 ë±ë¡íë, ì´ë²ì ì´ ì¬ì©ì ì ì ììê° ì´ë¤ ìì를 ììë°ëì§ë¥¼ ëíë´ë ìµì
ê°ì²´ë¥¼ í¬í¨í©ëë¤.
customElements.define("expanding-list", ExpandingList, { extends: "ul" });
ì¹ documentìì ì´ ë´ì¥ ìì를 ì¬ì©íë ê²ì ëí ì´ë ì ë ë¤ë¥´ê² ë³´ì ëë¤.
<ul is="expanding-list">
...
</ul>
<ul>
ìì를 íë²íê² ì¬ì©íë, is
í¹ì± ë´ë¶ì ì¬ì©ì ì ì ììì ì´ë¦ì ëª
ìí©ëë¤.
ìëª ì£¼ê¸° ì½ë°± ì¬ì©íê¸°ì°¸ê³ : ì ì²´ JavaScript ìì¤ ì½ë를 íì¸í´ë³¼ ì ììµëë¤.
ëª ê°ì§ ë¤ë¥¸ ì½ë°±ì ì¬ì©ì ì ì ììì í´ëì¤ ì ì ë´ë¶ì ì ìí ì ìëë°, ì´ ì½ë°±ë¤ì ììì ìëª ì£¼ê¸°ì ê°ê¸° ë¤ë¥¸ ì§ì ìì ë°ìë©ëë¤.
connectedCallback
: ì¬ì©ì ì ì ììê° ë¬¸ìì ì°ê²°ë ììì ì¶ê°ë ëë§ë¤ í¸ì¶ë©ëë¤. ì´ê²ì ë
¸ëê° ì´ëë ëë§ë¤ ë°ìí ê²ì´ë©°, ììì ë´ì©ì´ ìì í í´ìë기 ì ì ë°ìí ì§ë 모ë¦
ëë¤.
ì°¸ê³ :
connectedCallback
ì ììê° ë ì´ì ì°ê²°ëì§ ììì ë í¸ì¶ë ìë ìì¼ë¯ë¡, íì¤íê² í기 ìí´ìNode.isConnected
를 ì¬ì©íì¸ì.
disconnectedCallback
: ì¬ì©ì ì ì ììê° documentì DOMìì ì°ê²° í´ì ëìì ëë§ë¤ í¸ì¶ë©ëë¤.
adoptedCallback
: ì¬ì©ì ì ì ììê° ìë¡ì´ documentë¡ ì´ëëìì ëë§ë¤ í¸ì¶ë©ëë¤.
attributeChangedCallback
: ì¬ì©ì ì ì ììì í¹ì±ë¤ ì¤ íëê° ì¶ê°ëê±°ë, ì ê±°ëê±°ë, ë³ê²½ë ëë§ë¤ í¸ì¶ë©ëë¤. ì´ë¤ í¹ì±ì´ ë³ê²½ì ëí´ ì릴ì§ë static get observedAttributes
ë©ìëìì ëª
ìë©ëë¤.
ì´ê²ë¤ì ì¬ì©ë¡ë¥¼ ë´ ìë¤. ìëì ì½ëë life-cycle-callbacks ìì ìì ì·¨í´ì¡ìµëë¤ (ìë ìì ë ë³¼ ì ììµëë¤). ì´ê²ì íì´ì§ì ê³ ì ë í¬ê¸°ì ìì´ ì¹ í´ì§ ì¬ê°íì ìì±íë ìì ìì ì ëë¤. ì¬ì©ì ì ì ììë ë¤ìê³¼ ê°ì´ ìê²¼ìµëë¤.
<custom-square l="100" c="red"></custom-square>
í´ëì¤ ìì±ìë ì ë§ë¡ ê°ë¨í©ëë¤. shadow DOMì ììì ë¶ì°©íê³ , ë¹ <div>
ì <style>
ìì를 shadow rootì ë¶ì°©í©ëë¤.
const shadow = this.attachShadow({ mode: "open" });
const div = document.createElement("div");
const style = document.createElement("style");
shadow.appendChild(style);
shadow.appendChild(div);
ì´ ìì ììì íµì¬ í¨ìë updateStyle()
ì
ëë¤. ì´ í¨ìë ìì를 ì·¨íê³ , ììì shadow rootì ì»ê³ , shadow rootì <style>
ìì를 ì°¾ê³ , width
, height
, background-color
를 ì¤íì¼ì ì¶ê°í©ëë¤.
function updateStyle(elem) {
const shadow = elem.shadowRoot;
shadow.querySelector("style").textContent = `
div {
width: ${elem.getAttribute("l")}px;
height: ${elem.getAttribute("l")}px;
background-color: ${elem.getAttribute("c")};
}
`;
}
ì¤ì ê°±ì ì 모ë ìëª
주기 ì½ë°±ì ìí´ ë¤ë¤ì§ëë°, ì´ ì½ë°±ë¤ì í´ëì¤ ì ì ë´ë¶ì ë©ìëë¡ ìì¹í©ëë¤. connectedCallback()
ì ììê° DOMì ì¶ê°ë ëë§ë¤ ì¤íë©ëë¤. ì¬ê¸°ì updateStyle()
í¨ìê° ì¤íëì´ ì¬ê°íì´ ì´ê²ì í¹ì±ì ì ìë ëë¡ ê¾¸ë©°ì§ëë¡ í©ëë¤.
connectedCallback() {
console.log('Custom square element added to page.');
updateStyle(this);
}
disconnectedCallback()
ê³¼ adoptedCallback()
ì½ë°±ì ì½ìì ê°ë¨í ë©ìì§ë¥¼ ë¡ê·¸íì¬ ì¸ì ììê° DOMìì ì ê±°ëìëì§, í¹ì ë¤ë¥¸ íì´ì§ë¡ ì´ëëìëì§ë¥¼ ì립ëë¤.
disconnectedCallback() {
console.log('Custom square element removed from page.');
}
adoptedCallback() {
console.log('Custom square element moved to new page.');
}
attributeChangedCallback()
ì ììì í¹ì± ì¤ íëê° ì´ë í ë°©ìì¼ë¡ ë³ê²½ë ëë§ë¤ ì¤íë©ëë¤. ì´ ì½ë°±ì 매ê°ë³ììì ë³¼ ì ìë¤ìí¼, í¹ì±ì ì´ë¦, ì´ì ê°, ìë¡ì´ ê°ì ë³´ê³ í¹ì±ì ë³ê²½ ì¬íì ê°ë³ì ì¼ë¡ ëìíë ê² ê°ë¥í©ëë¤. ê·¸ë¬ë, ì´ë² ê²½ì°ìë ê°ë³ì ì¼ë¡ ëìíì§ ìê³ , ì¬ê°íì ì¤íì¼ì´ ìë¡ì´ ê°ì ë°ë¼ ê°±ì ë ì ìëë¡ ë¨ìí updateStyle()
í¨ì를 ë¤ì í¸ì¶í©ëë¤.
attributeChangedCallback(name, oldValue, newValue) {
console.log('Custom square element attributes changed.');
updateStyle(this);
}
attributeChangedCallback()
ì½ë°±ì´ í¹ì±ì´ ë³ê²½ëìì ë ë°ìë기 í기 ìí´ìë, í´ë¹ í¹ì±ì ê´ì°°í´ì¼ë§ í©ëë¤. ì´ ìì
ì static get observedAttributes()
ë©ìë를 ì¬ì©ì ì ì ìì í´ëì¤ ë´ë¶ì ëª
ìí¨ì¼ë¡ì¨ ì´ë£¨ì´ì§ëë¤. ì´ ë©ìëë ê´ì°°í기를 ìíë í¹ì±ë¤ì ì´ë¦ì í¬í¨íë ë°°ì´ì return
í´ì¼ í©ëë¤.
static get observedAttributes() { return ['c', 'l']; }
ì´ ìì ìì ì´ ë©ìëë ìì±ìì ë°ë¡ ìì ìì¹í´ ììµëë¤.
í¸ëì¤íì¼ë¬ ë í´ëì¤ì°¸ê³ : ì ì²´ JavaScript ìì¤ ì½ë를 íì¸í´ ë³´ì¸ì.
ES2015 classë ë ê±°ì ë¸ë¼ì°ì 를 목íë¡ íë Babel 6 ëë TypeScript ìì ì 뢰í ë§íê² í¸ëì¤íì¼ë ì ìë¤ë ì ì 주ìíì¸ì. Babel 7ì ì¬ì©íê±°ë Babel 6ì ëí´ì babel-plugin-transform-builtin-classes를 ì¬ì©í ì ìê³ , ë ê±°ì ëì ì TypeScriptì ES2015를 목íë¡ í ì ììµëë¤.
ë¼ì´ë¸ë¬ë¦¬ì¬ì©ì ì ì ìì를 ìì±í ë ì¶ìíì ë¨ê³ë¥¼ ì¬ë¦¬ë ê²ì 목íë¡ íë ì¹ ì»´í¬ëí¸ë¥¼ 기ë°ì¼ë¡ íë ëª ê°ì§ì ë¼ì´ë¸ë¬ë¦¬ë¤ì´ ììµëë¤. ì´ë¬í ë¼ì´ë¸ë¬ë¦¬ìë FASTElement, snuggsi, X-Tag, Slim.js, Lit, Smart, Stencil, hyperHTML-Element, DataFormsJS, Custom-Element-Builderê° ììµëë¤.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4