摘要:通過創建元素時也有不同也可以直接調用構造函數創建注直到版本,擴展內置元素依然在開發中。自定義元素被移入新的時調用。
很早我們就可以在 HTML 文檔中寫
通過瀏覽器提供的 Custom elements api 我們能定義一個自定義元素,并且告知 HTML 解析器如何正確地構造一個元素,以及在該元素的屬性變化時執行相應的處理。
定義新元素比如我們想要像
首先我們定義一個類 DateString 派生自 HTMLElement。
class DateString extends HTMLElement { constructor() { super() return } // 返回需要監聽的屬性,當屬性值改變的時候會調用 attributeChangedCallback 這個方法 static get observedAttributes () { return ["ln"] } attributeChangedCallback (name, oldValue, newValue) { this.updateRendering (newValue) } // 元素插入到文檔中時調用 connectedCallback() { const ln = this.getAttribute("ln") this.updateRendering(ln) } // 元素從文檔中移除時調用 disconnectedCallback () { window.clearInterval(this.interval) } updateRendering (ln = "zh") { // 一個比較好的實踐就是在渲染時,檢查元素的 ownerDocument.defaultView, 如果不存在則什么都不干 if (!this.ownerDocument.defaultView) { return } if (this.interval) { window.clearInterval(this.interval) } this.interval = setInterval(() => { if (ln === "zh") { this.innerHTML = new Date().toLocaleString() } else { this.innerHTML = new Date().toString() } }, 1000) } }
然后調用 customElements.define() 注冊這個自定義元素,設置屬性并插入到 body 中。
customElements.define("date-string", DateString) const dateStr = document.createElement("date-string") dateStr.setAttribute("ln", "zh") document.body.appendChild(dateStr)
也可以用直接調用構造函數創建元素
const dateStr = new DateString() dateStr.setAttribute("ln", "zh") document.body.appendChild(dateStr)
自定義元素可以使用符合規范的任意屬性名,下面說的派生內置元素類型要自定義屬性,則要用 data-*
上面代碼那樣設置屬性很繁瑣,我們可以做一個屬性映射,以期望 dateStr.ln = "zh" 這樣賦值
class DateString extends HTMLElement { ... get ln () { return this.getAttribute("ln") } set ln (value) { this.setAttribute("ln", value) } }元素升級
除了像上面那樣用 JavaScript 代碼創建元素并添加到 body 下面,也可以直接在 HTML 寫自定義元素
Document
上面的代碼依然正常工作。首先瀏覽器正常解析文檔,遇到
需要注意的是,只有插入到文檔中的元素才會升級:
派生內置元素類型Document
除了從 HTMLElement 派生自定義元素,我們還可以從 HTMLButtonElement, HTMLDivElement 等內置元素類型派生自定義元素。這么做的好處是,可以保留內置元素的語義化功能。比如,HTMLButtonElement 有 active 狀態,通過按 tab 鍵可以使 button 元素獲得焦點,然后按回車鍵相當于點擊 button 元素。現在我們從 HTMLButtonElement 派生一個自定義的按鈕,并在點擊的時候改變背景顏色。
Document
這個按鈕在行為上與內置的 button 一樣, 可以獲取焦點,提交表單,也有禁用屬性等。
派生內置元素與自定義元素略微不同,調用 customElements.define 時要傳入第三個參數表明是從那個元素派生,這里使用的名稱是 "button" 即標簽名,因為瀏覽器是靠識別標簽名來提供語義和默認行為,基于這一點,使用的時候也是用的原本的標簽名 button,然后再給一個 is 屬性指定自定義元素的名稱。
通過 document.createElement 創建元素時也有不同
const coloredButton = document.createElement("button", { is: "colored-button" })
也可以直接調用構造函數創建
const coloredButton = new ColoredButton console.log(coloredButton.localName) // => "button" console.log(coloredButton.getAttribute(is)) // => "colored-button"
注:直到 chrome 61 版本,擴展內置元素依然在開發中。參見鏈接
構造函數的一些限制自定義元素的構造函數必須遵循如下限制
構造函數中不能調用 document.write() 和 document.open()
不能訪問元素的屬性和子元素,因為在元素未升級的情況下(元素還未插入文檔中),不存在屬性和子元素
初始化工作要盡量推遲到 connectedCallback 中,尤其是涉及獲取資源或渲染的工作。但是 connectedCallback 可能會調用多次(每次插入到文檔中時都會調用),一次性的初始化工作需要自己設置防護措施。
命名限制自定義元素的命名限制如下
必須以小寫字母開頭
必須有至少一個中劃線
允許小寫字母,中劃線,下劃線,點號,數字
允許部分 Unicode 字符,所以
不允許下面這些名稱
annotation-xml
color-profile
font-face
font-face-src
font-face-uri
font-face-format
font-face-name
missing-glyph
如果名稱出現不允許的字符, customElements.define 會報錯。
生命周期函數自定義元素可以定義特殊生命周期鉤子,以便在其存續的特定時間內運行代碼。
constructor 創建或升級元素的一個實例。用于初始化狀態、設置事件偵聽器。
connectedCallback 元素每次插入到 DOM 時都會調用。可用于獲取資源或渲染。
disconnectedCallback 元素每次從 DOM 中移除時都會調用。用于運行清理代碼。
attributeChangedCallback 屬性添加、移除、更新或替換。僅對 observedAttributes 中返回的屬性有效。
adoptedCallback 自定義元素被移入新的 document 時調用。
響應回調是同步的。如果有人對您的元素調用 el.setAttribute(...),瀏覽器將立即調用 attributeChangedCallback()。 同理,從 DOM 中移除元素(例如用戶調用 el.remove())后,您會立即收到 disconnectedCallback()。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51342.html
摘要:明確各階段適合的操作用于初始化元素的狀態和設置事件監聽,或者創建。事件類型轉換通過捕獲事件,然后通過發起事件來對事件類型進行轉換,從而觸發更符合元素特征的事件類型。 前言 ?通過《WebComponent魔法堂:深究Custom Element 之 面向痛點編程》,我們明白到其實Custom Element并不是什么新東西,我們甚至可以在IE5.5上定義自己的alert元素。但這種簡單...
摘要:若自定義元素標簽名稱不可用則摒棄。總之,自定義元素讓開發者的代碼更易理解和維護,并分割為小型,可復用及可封裝的模塊。被稱為自定義元素接口,雖然現在仍然可用,但是已經被棄用并被認為是糟糕的實現。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 這是 JavaScript 工作原理第十九章。 概述 在 前述文章中,我們介紹了 Shadow ...
摘要:以下是關于中一些模塊的概要以及它們與這篇文章的關聯性這個模塊實現了我們在這篇文章中討論的關于的幾個回調函數,同時它還會初始化一個策略類,這個類會作為連接和的橋梁。 現在,Angular Elements 這個項目已經在社區引起一定程度的討論。這是顯而易見的,因為 Angular Elements 提供了很多開箱即用的、十分強大的功能: 通過使用原生的 HTML 語法來使用 Angul...
摘要:通過創建元素時也有不同也可以直接調用構造函數創建注直到版本,擴展內置元素依然在開發中。自定義元素被移入新的時調用。 很早我們就可以在 HTML 文檔中寫 這樣的自定義名稱標簽。但是瀏覽器對于不認識的標簽一律當成一個普通的行內元素處理,沒有相關語義。雖然我們能用 JavaScript 代碼給它添加一些功能,但是并沒有生命周期相關的函數供我們做一些初始化和銷毀的處理。 通過瀏覽器提供...
閱讀 3493·2021-11-23 10:13
閱讀 863·2021-09-22 16:01
閱讀 909·2021-09-09 09:33
閱讀 630·2021-08-05 09:58
閱讀 1717·2019-08-30 11:14
閱讀 1935·2019-08-30 11:02
閱讀 3265·2019-08-29 16:28
閱讀 1478·2019-08-29 16:09