国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 custom element 創建自定義元素

Allen / 1748人閱讀

摘要:通過創建元素時也有不同也可以直接調用構造函數創建注直到版本,擴展內置元素依然在開發中。自定義元素被移入新的時調用。

很早我們就可以在 HTML 文檔中寫 這樣的自定義名稱標簽。但是瀏覽器對于不認識的標簽一律當成一個普通的行內元素處理,沒有相關語義。雖然我們能用 JavaScript 代碼給它添加一些功能,但是并沒有生命周期相關的函數供我們做一些初始化和銷毀的處理。

通過瀏覽器提供的 Custom elements api 我們能定義一個自定義元素,并且告知 HTML 解析器如何正確地構造一個元素,以及在該元素的屬性變化時執行相應的處理。

定義新元素

比如我們想要像 這樣使用一個顯示日期字符串的標簽,并且在 ln 屬性為 zh 時顯示中文格式,en 時顯示英文格式。

首先我們定義一個類 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


  
  

上面的代碼依然正常工作。首先瀏覽器正常解析文檔,遇到 標簽時,把它當做一個普通的行內元素對待,實際上是 HTMElement 類型(如果標簽的名稱中沒有中劃線,,那么則是 HTMLUnknownElement 類型實例)。當 派生內置元素類型

除了從 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 之 標準構建

    摘要:明確各階段適合的操作用于初始化元素的狀態和設置事件監聽,或者創建。事件類型轉換通過捕獲事件,然后通過發起事件來對事件類型進行轉換,從而觸發更符合元素特征的事件類型。 前言 ?通過《WebComponent魔法堂:深究Custom Element 之 面向痛點編程》,我們明白到其實Custom Element并不是什么新東西,我們甚至可以在IE5.5上定義自己的alert元素。但這種簡單...

    philadelphia 評論0 收藏0
  • 定義元素探秘及構建可復用組件最佳實踐

    摘要:若自定義元素標簽名稱不可用則摒棄。總之,自定義元素讓開發者的代碼更易理解和維護,并分割為小型,可復用及可封裝的模塊。被稱為自定義元素接口,雖然現在仍然可用,但是已經被棄用并被認為是糟糕的實現。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 這是 JavaScript 工作原理第十九章。 概述 在 前述文章中,我們介紹了 Shadow ...

    CoorChice 評論0 收藏0
  • Angular Elements 及其運作原理

    摘要:以下是關于中一些模塊的概要以及它們與這篇文章的關聯性這個模塊實現了我們在這篇文章中討論的關于的幾個回調函數,同時它還會初始化一個策略類,這個類會作為連接和的橋梁。 現在,Angular Elements 這個項目已經在社區引起一定程度的討論。這是顯而易見的,因為 Angular Elements 提供了很多開箱即用的、十分強大的功能: 通過使用原生的 HTML 語法來使用 Angul...

    qingshanli1988 評論0 收藏0
  • 使用 custom element 創建定義元素

    摘要:通過創建元素時也有不同也可以直接調用構造函數創建注直到版本,擴展內置元素依然在開發中。自定義元素被移入新的時調用。 很早我們就可以在 HTML 文檔中寫 這樣的自定義名稱標簽。但是瀏覽器對于不認識的標簽一律當成一個普通的行內元素處理,沒有相關語義。雖然我們能用 JavaScript 代碼給它添加一些功能,但是并沒有生命周期相關的函數供我們做一些初始化和銷毀的處理。 通過瀏覽器提供...

    timger 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<