Ðдна из клÑÑевÑÑ Ð¾ÑобенноÑÑей ÑÑандаÑÑа Ðеб-ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ ÑÑо возможноÑÑÑ ÑоздаваÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие ÑлеменÑÑ Ð½Ð° HTML-ÑÑÑаниÑе, инкапÑÑлиÑÑÑÑие ÑÑнкÑионалÑноÑÑÑ, вмеÑÑо Ñого ÑÑÐ¾Ð±Ñ ÑоздаваÑÑ Ð´Ð»Ð¸Ð½Ð½ÑÑ, вложеннÑÑ Ð³ÑÑÐ¿Ð¿Ñ ÑлеменÑов, коÑоÑÑе Ð±Ñ Ð²Ð¼ÐµÑÑе ÑеализовÑвали нÑжнÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкÑÑ ÑиÑÑ. ÐÑа ÑÑаÑÑÑ ÑвлÑеÑÑÑ Ð²Ð²Ð¾Ð´Ð½Ð¾Ð¹ по иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ¸Ñ HTML-компоненÑ.
ÐÑимеÑание: ÐолÑзоваÑелÑÑкие ÑлеменÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð² Firefox, Chrome и Opera. Safari пока поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко авÑономнÑе полÑзоваÑелÑÑкие компоненÑÑ, Edge Ñакже ÑабоÑÐ°ÐµÑ Ð½Ð°Ð´ ÑеализаÑией.
ÐÑÑокоÑÑовневÑй обзоÑÐонÑÑоллеÑом полÑзоваÑелÑÑкиÑ
ÑлеменÑов веб-докÑменÑа ÑвлÑеÑÑÑ Ð¾Ð±ÑÐµÐºÑ CustomElementRegistry
â ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑегиÑÑÑиÑоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие ÑлеменÑÑ Ð½Ð° веб-ÑÑÑаниÑе, возвÑаÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ заÑегиÑÑÑиÑованнÑÑ
ÑлеменÑаÑ
и Ñ.п.
ЧÑÐ¾Ð±Ñ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð° ÑÑÑаниÑе, иÑполÑзÑйÑе меÑод CustomElementRegistry.define()
method. Ðн пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑменÑÑ:
DOMString
- Ð¸Ð¼Ñ ÑлеменÑа. ÐбÑаÑиÑе внимание, ÑÑо в именаÑ
полÑзоваÑелÑÑкиÑ
ÑлеменÑаÑ
должен ÑодеÑжаÑÑÑÑ Ð´ÐµÑиÑ; они не могÑÑ ÑоÑÑоÑÑÑ ÑолÑко из одного Ñлова.extends
, ÑооÑвеÑÑÑвÑÑÑее вÑÑÑÐ¾ÐµÐ½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑого наÑледÑÐµÑ Ð¾Ð±ÑекÑ.РпÑимеÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ опÑеделиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ word-count element:
customElements.define("word-count", WordCount, { extends: "p" });
ÐÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð·ÑваеÑÑÑ word-count
, обÑÐµÐºÑ ÑооÑвеÑÑÑвÑÑÑего клаÑÑа назÑваеÑÑÑ WordCount
, и он наÑледÑÐµÑ ÑлеменÑÑ <p>
.
ÐбÑÐµÐºÑ ÐºÐ»Ð°ÑÑа полÑзоваÑелÑÑкого ÑлеменÑа опÑеделÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑинÑакÑиÑа клаÑÑов ES 2015. ÐапÑимеÑ, WordCount
имеÑÑ ÑледÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ:
class WordCount extends HTMLParagraphElement {
constructor() {
// ÐÑегда пеÑвÑм делом вÑзÑвайÑе super() в конÑÑÑÑкÑоÑе
super();
// Ðалее пиÑеÑÑÑ ÑÑнкÑионалÑноÑÑÑ ÑлеменÑа
...
}
}
ÐÑо пÑоÑÑой пÑимеÑ, но его можно дополниÑÑ. Ðожно опÑеделиÑÑ ÑпеÑиалÑнÑе lifecycle callbacks, коÑоÑÑе бÑдÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ð² опÑеделÑннÑе моменÑÑ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ Ñикла ÑлеменÑа. ÐапÑимеÑ, connectedCallback
бÑÐ´ÐµÑ Ð²Ñзван, когда полÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð²Ð¿ÐµÑвÑе вÑÑÑоен в DOM, а attributeChangedCallback
вÑзÑваеÑÑÑ, когда полÑзоваÑелÑÑÐºÐ¾Ð¼Ñ ÑлеменÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ, ÑдалÑÑÑ Ð¸Ð»Ð¸ изменÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо аÑÑибÑÑ.
ÐодÑобнее об ÑÑом в ÑекÑии Using the lifecycle callbacks ниже.
ÐÑÑÑ Ð´Ð²Ð° Ñипа полÑзоваÑелÑÑÐºÐ¸Ñ ÑлеменÑов:
<popup-info>
или document.createElement("popup-info")
.is
. ÐапÑÐ¸Ð¼ÐµÑ <p is="word-count">
, или document.createElement("p", { is: "word-count" })
.Ð ÑейÑÐ°Ñ Ð´Ð°Ð²Ð°Ð¹Ñе ÑазбеÑÑм еÑÑ Ð½ÐµÑколÑко пÑоÑÑÑÑ Ð¿ÑимеÑов, иллÑÑÑÑиÑÑÑÑÐ¸Ñ Ð¿Ð¾Ð´ÑобноÑÑи ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ¸Ñ ÑлеменÑов.
ÐвÑономнÑе полÑзоваÑелÑÑкие ÑлеменÑÑРаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ Ð°Ð²Ñономного полÑзоваÑелÑÑкого ÑлеменÑа â <popup-info-box>
(Ñм. ÑабоÑаÑÑий пÑимеÑ). Ðн ÑодеÑÐ¶Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñажение и ÑÑÑокÑ, и вÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ Ð¸Ð·Ð¾Ð±Ñажение в ÑÑÑаниÑÑ. Ðогда на изобÑажение наводÑÑ ÑокÑÑ, ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð²ÑплÑваÑÑÑÑ Ð¿Ð¾Ð´ÑÐºÐ°Ð·ÐºÑ Ñ ÑекÑÑом.
ÐÑежде вÑего Ñайл JavaScript опÑеделÑÐµÑ ÐºÐ»Ð°ÑÑ PopUpInfo
, наÑледÑÑÑий Ð¾Ñ HTMLElement
. ÐвÑономнÑе полÑзоваÑелÑÑкие ÑлеменÑÑ Ð¿Ð¾ÑÑи вÑегда наÑледÑÑÑ HTMLElement
.
class PopUpInfo extends HTMLElement {
constructor() {
// ÐÑегда пеÑвÑм делом вÑзÑвайÑе super() в конÑÑÑÑкÑоÑе
super();
// далее ÑледÑÐµÑ ÑÑнкÑионалÑноÑÑÑ ÑлеменÑа
...
}
}
Ð ÑÑом ÑÑагменÑе кода ÑодеÑжиÑÑÑ Ð¾Ð¿Ñеделение конÑÑÑÑкÑоÑа constructor
клаÑÑа, коÑоÑое вÑегда наÑинаеÑÑÑ Ñ Ð²Ñзова super()
ÑÑÐ¾Ð±Ñ Ð¾ÑÑабоÑала ÑепоÑка пÑоÑоÑипного наÑледованиÑ.
ÐнÑÑÑи конÑÑÑÑкÑоÑа Ð¼Ñ Ð¾Ð¿ÑеделÑем вÑÑ ÑÑнкÑионалÑноÑÑÑ, коÑоÑÑÑ Ð¿Ð¾Ð»ÑÑÐ¸Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ñи Ñоздании его обÑекÑа. Рданном ÑлÑÑае Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем shadow root к полÑзоваÑелÑÑÐºÐ¾Ð¼Ñ ÑлеменÑÑ, пÑоизводим манипÑлÑÑии Ñ DOM, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¾Ð¿ÑеделÑннÑÑ ÑÑÑÑкÑÑÑÑ shadow DOM внÑÑÑи ÑлеменÑа â коÑоÑÐ°Ñ Ð·Ð°Ñем пÑиÑоединÑеÑÑÑ Ðº shadow root â и Ð½Ð°ÐºÐ¾Ð½ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем CSS к shadow root, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ ÐµÐ³Ð¾ ÑÑилÑ.
// Создание shadow root
var shadow = this.attachShadow({ mode: "open" });
// Создание spans
var wrapper = document.createElement("span");
wrapper.setAttribute("class", "wrapper");
var icon = document.createElement("span");
icon.setAttribute("class", "icon");
icon.setAttribute("tabindex", 0);
var info = document.createElement("span");
info.setAttribute("class", "info");
// ÐеÑÑм ÑодеÑжимое аÑÑибÑÑа и добавлÑем его в span
var text = this.getAttribute("text");
info.textContent = text;
// ÐÑÑавлÑем иконкÑ
var imgUrl;
if (this.hasAttribute("img")) {
imgUrl = this.getAttribute("img");
} else {
imgUrl = "img/default.png";
}
var img = document.createElement("img");
img.src = imgUrl;
icon.appendChild(img);
// СоздаÑм CSS Ð´Ð»Ñ shadow dom
var style = document.createElement("style");
style.textContent =
".wrapper {" +
// CSS truncated for brevity
// добавлÑем ÑозданнÑе ÑлеменÑÑ Ðº shadow dom
shadow.appendChild(style);
shadow.appendChild(wrapper);
wrapper.appendChild(icon);
wrapper.appendChild(info);
ÐаконеÑ, ÑегиÑÑÑиÑÑем полÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² CustomElementRegistry
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода define()
, коÑоÑÑй ÑпоминалÑÑ Ñанее â в каÑеÑÑве паÑамеÑÑов Ð¼Ñ Ð¿ÐµÑедаÑм ÐµÐ¼Ñ Ð¸Ð¼Ñ ÑлеменÑа и Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ ÐµÐ³Ð¾ ÑÑнкÑионалÑноÑÑÑ:
customElements.define("popup-info", PopUpInfo);
ТепеÑÑ Ð¾Ð½ доÑÑÑпен Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° наÑей ÑÑÑаниÑе. Ð HTML Ð¼Ñ Ð¸ÑполÑзÑем его Ñак:
<popup-info
img="img/alt.png"
text="Ðод валидаÑии ваÑей каÑÑÑ (CVC)
ÑÑо дополниÑелÑÐ½Ð°Ñ Ð¼ÐµÑа безопаÑноÑÑи â ÑÑо поÑледние 3 или 4 ÑиÑÑÑ
на обоÑоÑе ваÑей каÑÑÑ."></popup-info>
ÐÑимеÑание: ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑоÑиÑаÑÑ Ð¿Ð¾Ð»Ð½Ñй иÑÑ Ð¾Ð´Ð½Ñй код на JavaScript здеÑÑ.
ÐодиÑиÑиÑованнÑе вÑÑÑоеннÑе ÑлеменÑÑТепеÑÑ Ð´Ð°Ð²Ð°Ð¹Ñе взглÑнем на дÑÑгой пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑованного полÑзоваÑелÑÑкого ÑлеменÑа â ÑаÑкÑÑваÑÑийÑÑ ÑпиÑок (Ñм. дейÑÑвÑÑÑий пÑимеÑ). Ðн пÑевÑаÑÐ°ÐµÑ Ð»Ñбой ненÑмеÑованнÑй ÑпиÑок в ÑаÑкÑÑваÑÑееÑÑ/ÑкладÑваÑÑееÑÑ Ð¼ÐµÐ½Ñ.
ÐеÑвÑм делом опÑеделим клаÑÑ ÑлеменÑа наподобие Ñого, как ÑÑо делалоÑÑ Ð²ÑÑе:
class ExpandingList extends HTMLUListElement {
constructor() {
// ÐÑегда пеÑвÑм делом вÑзÑваем super() в конÑÑÑÑкÑоÑе
super();
// ниже ÑледÑÐµÑ ÑÑнкÑионалÑноÑÑÑ ÑлеменÑа
...
}
}
ÐдеÑÑ Ð¼Ñ Ð½Ðµ бÑдем во вÑеÑ
подÑобноÑÑÑÑ
опиÑÑваÑÑ ÑÑнкÑионалÑноÑÑÑ ÑлеменÑа, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе понÑÑÑ ÐºÐ°Ðº он ÑабоÑаеÑ, поÑмоÑÑев иÑÑ
однÑй код. ÐдинÑÑвенное пÑинÑипиалÑное ÑазлиÑие Ñ Ð¿ÑедÑдÑÑим пÑимеÑом ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ð¼Ñ Ð¸ÑполÑзÑем инÑеÑÑÐµÐ¹Ñ HTMLUListElement
, а не HTMLElement
. Так ÑÑо Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð²Ñе Ñ
аÑакÑеÑиÑÑики ÑлеменÑа <ul>
, плÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ ÑÑнкÑионалÑноÑÑÑ, коÑоÑÑÑ Ð¾Ð¿Ñеделили мÑ. ÐÑо и оÑлиÑÐ°ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑованнÑй вÑÑÑоеннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾Ñ Ð°Ð²Ñономного полÑзоваÑелÑÑкого ÑлеменÑа.
Ðалее Ð¼Ñ ÑегиÑÑÑиÑÑем ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода define()
как в пÑоÑлом пÑимеÑе, ÑолÑко на Ñей Ñаз Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем обÑÐµÐºÑ options, коÑоÑÑй опÑеделÑеÑ, ÐºÐ°ÐºÐ¾Ð¼Ñ Ð²ÑÑÑÐ¾ÐµÐ½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ Ð½Ð°ÑледÑÐµÑ Ð´Ð°Ð½Ð½Ñй:
customElements.define("expanding-list", ExpandingList, { extends: "ul" });
ÐÑÑÑоеннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ÑполÑзÑеÑÑÑ Ð½Ð° веб-ÑÑÑаниÑе немного по-дÑÑгомÑ:
<ul is="expanding-list">
...
</ul>
ÐÑ Ð·Ð°Ð´Ð°ÑÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ <ul>
как обÑÑно, но ÑказÑваеÑе Ð¸Ð¼Ñ Ð¼Ð¾Ð´Ð¸ÑиÑиÑованного ÑлеменÑа в аÑÑибÑÑе is
.
ÐÑимеÑание: ÐолнÑй иÑÑ Ð¾Ð´Ð½Ñй код на JavaScript доÑÑÑпен здеÑÑ.
ÐÑполÑзование lifecycle callbacksÐÑ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ Ð½ÐµÑколÑко ÑазнÑÑ ÐºÐ¾Ð»Ð±Ñков в конÑÑÑÑкÑоÑе полÑзоваÑелÑÑÐºÐ¸Ñ ÑлеменÑов, коÑоÑÑе ÑÑабоÑаÑÑ Ð½Ð° ÑазнÑÑ ÑÑÐ°Ð¿Ð°Ñ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ Ñикла ÑлеменÑа:
connectedCallback
: СÑабаÑÑваеÑ, когда полÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¿ÐµÑвÑе добавлÑеÑÑÑ Ð² DOM.disconnectedCallback
: СÑабаÑÑваеÑ, когда полÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑдалÑеÑÑÑ Ð¸Ð· DOM.adoptedCallback
: СÑабаÑÑваеÑ, когда полÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÐµÑемеÑÑн в новÑй докÑменÑ.attributeChangedCallback
: СÑабаÑÑваеÑ, когда полÑзоваÑелÑÑÐºÐ¾Ð¼Ñ ÑлеменÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ, ÑдалÑÑÑ Ð¸Ð»Ð¸ изменÑÑÑ Ð°ÑÑибÑÑ.ÐоÑмоÑÑим на Ð½Ð¸Ñ Ð² дейÑÑвии. Ðод ниже взÑÑ Ð¸Ð· пÑимеÑа life-cycle-callbacks (Ñм. его в дейÑÑвии). ÐÑо ÑÑивиалÑнÑй пÑимеÑ, ÑоздаÑÑий на ÑÑÑаниÑе ÑвеÑной квадÑаÑ. ÐÐ¾Ñ ÐºÐ°Ðº вÑглÑÐ´Ð¸Ñ ÐºÐ¾Ð´ полÑзоваÑелÑÑкого ÑлеменÑа:
<custom-square l="100" c="red"></custom-square>
ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа оÑÐµÐ½Ñ Ð¿ÑоÑÑой â Ð¼Ñ Ð¿ÑоÑÑо добавлÑем shadow DOM к ÑлеменÑÑ, а заÑем добавлÑем пÑÑÑÑе ÑлеменÑÑ <div>
и <style>
к shadow root:
var shadow = this.attachShadow({ mode: "open" });
var div = document.createElement("div");
var style = document.createElement("style");
shadow.appendChild(style);
shadow.appendChild(div);
Ðаиболее Ð²Ð°Ð¶Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð² ÑÑом пÑимеÑе updateStyle()
â она пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑлеменÑ, наÑ
Ð¾Ð´Ð¸Ñ ÐµÐ³Ð¾ shadow root, наÑ
Ð¾Ð´Ð¸Ñ ÐµÐ³Ð¾ ÑÐ»ÐµÐ¼ÐµÐ½Ñ <style>
, и добавлÑÐµÑ width
, height
, и background-color
к ÑÑилÑм.
function updateStyle(elem) {
var shadow = elem.shadowRoot;
var childNodes = shadow.childNodes;
for (var i = 0; i < childNodes.length; i++) {
if (childNodes[i].nodeName === "STYLE") {
childNodes[i].textContent =
"div {" +
" width: " +
elem.getAttribute("l") +
"px;" +
" height: " +
elem.getAttribute("l") +
"px;" +
" background-color: " +
elem.getAttribute("c");
}
}
}
Сами Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑилей обÑабаÑÑваÑÑÑÑ ÐºÐ¾Ð»Ð±Ñками жизненного Ñикла, наÑ
одÑÑимиÑÑ Ð²Ð½ÑÑÑи конÑÑÑÑкÑоÑа. connectedCallback()
ÑÑабаÑÑваеÑ, когда ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²ÑÑÑаиваеÑÑÑ Ð² DOM â здеÑÑ Ð¼Ñ Ð·Ð°Ð¿ÑÑкаем ÑÑнкÑÐ¸Ñ updateStyle()
коÑоÑÐ°Ñ Ð¾Ð±ÐµÑпеÑиваеÑ, ÑÑÐ¾Ð±Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð¸Ð¼ÐµÐ» ÑÑилÑ, опиÑаннÑй в его аÑÑибÑÑаÑ
:
connectedCallback() {
console.log('ÐолÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ на ÑÑÑаниÑÑ.');
updateStyle(this);
}
колбÑки disconnectedCallback()
и adoptedCallback()
логиÑÑÑÑ Ð¿ÑоÑÑÑе ÑообÑÐµÐ½Ð¸Ñ Ð½Ð° конÑолÑ, коÑоÑÑе ÑведомлÑÑÑ Ð½Ð°Ñ, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑдалÑн из DOM или пеÑемеÑÑн на дÑÑгÑÑ ÑÑÑаниÑÑ:
disconnectedCallback() {
console.log('ÐолÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ñдален.');
}
adoptedCallback() {
console.log('ÐолÑзоваÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð¿ÐµÑемеÑÑн на дÑÑгÑÑ ÑÑÑаниÑÑ.');
}
ÐолбÑк attributeChangedCallback()
запÑÑкаеÑÑÑ ÐºÐ¾Ð³Ð´Ð° один из аÑÑибÑÑов ÑлеменÑа менÑеÑÑÑ. Ðак видно из его ÑвойÑÑв, можно воздейÑÑвоваÑÑ Ð½Ð° индивидÑалÑнÑе аÑÑибÑÑÑ, глÑÐ´Ñ Ð½Ð° иÑ
имена, и новÑе и ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑов. Рданном ÑлÑÑае, однако, Ð¼Ñ Ð¿ÑоÑÑо Ñнова запÑÑкаем ÑÑнкÑÐ¸Ñ updateStyle()
ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо аÑÑибÑÑÑ ÐºÐ²Ð°Ð´ÑаÑа полÑÑили новÑе знаÑениÑ:
attributeChangedCallback(name, oldValue, newValue) {
console.log('ÐÑÑибÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкого ÑлеменÑа квадÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»Ð¸ÑÑ.');
updateStyle(this);
}
ÐбÑаÑиÑе внимание, ÑÑо нÑжно наблÑдаÑÑ Ð·Ð° аÑÑибÑÑами, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÑÑиÑÑ ÐºÐ¾Ð»Ð±Ñк attributeChangedCallback()
когда они изменÑÑÑÑ. ÐÑо делаеÑÑÑ ÑеÑез вÑзов геÑÑеÑа observedAttributes()
в конÑÑÑÑкÑоÑе, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ return
возвÑаÑаÑÑий маÑÑив Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ аÑÑибÑÑов, коÑоÑÑе Ð²Ñ Ñ
оÑиÑе наблÑдаÑÑ:
static get observedAttributes() {return ['w', 'l']; }
РнаÑем ÑлÑÑае он ÑаÑположен в наÑале конÑÑÑÑкÑоÑа.
ÐÑимеÑание: СмоÑÑиÑе полнÑй иÑÑ Ð¾Ð´Ð½Ñй код на JavaScript здеÑÑ.
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