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

資訊專欄INFORMATION COLUMN

# Web Components 全攬

legendmohe / 3388人閱讀

摘要:定制元素可以在原生元素外創建定制元素。此定制元素內部有一個加號按鈕,一個減號按鈕,一個顯示當前值。此主題會在下一部分內介紹。定制元素的屬性元素的屬性被稱為,對象內的屬性被稱為。做響應的同步處理。

Web Components 全攬

Web Components技術可以把一組相關的HTML、JS代碼和CSS風格打包成為一個自包含的組件,只要使用大家熟悉的標簽即可引入此組件。Web Components技術包括:

Custom Element

Shadow DOM

Template

HTML Import

四個分離而又互相關的四個構造塊。其中核心的即使是Custom Element、Shadow DOM,順便會講到而Template是一個支持技術。
HTML Import曾經被Chrome加入但是隨后和V0一起被廢棄。這里也不會討論它。

Custom Element 定制元素。

定制元素可以在原生元素外創建定制元素。定制元素是Web組件的一個基本構成塊。可以在一個js文件內包含Custom Element需要的全部要素,包括HTML模板、CSS Style和ES6類。并使用一個HTML文件,引用此js文件從而可以使用定制元素。

假設我們創建Spin Button,定制元素標簽為:


我們首先實現此定制元素,但是為了簡單起見,晚一點才看它的屬性。此定制元素內部有一個加號按鈕,一個減號按鈕,一個span顯示當前值。那么只需要把這個HTML模板組織、風格和代碼組合在一個文件內:

var template = `
    1
    
`
class SpinButton extends HTMLElement{
    connectedCallback(){
        this.innerHTML = template
        var b1 = this.querySelector("[inc]")
        var b2 = this.querySelector("[dec]")
        var s = this.querySelector("span")
        var i = 1
        b1.onclick = function(){
            s.innerHTML = i++
        }
        b2.onclick = function(){
            s.innerHTML = i--
        }
    }
}
customElements.define("spin-button",SpinButton)

并且創建一個index.html文件加載此文件,即可使用新的定制元素spin-button了:



你可以看到執行在瀏覽器內的界面上的兩個按鈕和一個span。創建一個定制元素有幾個要點:

新的JS定制類需要繼承于類HTMLElement

回調connectedCallback提供一個生命周期事件,當定制元素成功掛接到DOM后,會調用此回調,可以在此回調代碼內加入自己的定制內容

代碼中的this,指向了此定制元素本身,因此可以通過this.innerHTML設置本定制元素的內部DOM

這樣,我們創建了一個獨特的定制元素,這個元素不在原生的瀏覽器標簽內。

定制元素就是這樣創建了,并且對于使用者來說,只要通過熟悉的元素標簽,即可引用一組帶有定制風格、操作和界面的組件了。

但是此時的定制元素有一個問題,就是它內部定義的風格,不僅僅會影響內部的元素,也會泄露到外部導致文檔也被影響,從而引發我們不希望的邊際效應。比如在index.html內如果在文件尾部加入這樣的文本:

black

你會發現black文本不是默認的顏色,而是紅色,這樣紅色來自于定制元素內部的風格定義代碼。如果希望隔離組件內的風格定義,那么可以使用Shaddow DOM技術。此主題會在下一部分內介紹。

Shadow DOM

Web建站使用組件技術有比較長的歷史了,這個技術一直以來都有一個挑戰,就是如何讓一個頁面可以使用第三方控件,但是不會被此組件使用的CSS風格所影響。解決方案是CSS可以局部化。想要組件內部的風格不會影響到外部,辦法就是使用Shadow DOM。Shadow DOM創建了一個隔離區,在這個隔離區內的DOM是獨立的,這意味著:

內部DOM Tree不會被外部文檔訪問到

也不會被外部的風格設置影響

內部的風格也不會影響到外部文檔

我們拿前一個案例代碼做實驗,看看如果使用這個技術特性。

使用Shadow DOM的關鍵,是首先創建一個Shadow Node,整個組件內部的HTML片段都插入到此節點內,而不是直接使用組件的innerHTML。我們可以在組件對象的構造器內執行此代碼:

class SpinButton extends HTMLElement{
    constructor(){
        super()
        var shadow = this.attachShadow({mode:"open"})
        var t = document.createElement("template")
        t.innerHTML = template
        shadow.appendChild(t.content.cloneNode(true))
    }
}

執行后,你會發現span的風格不再影響組件之外的標簽。看起來還是很簡單的,只要把你本來需要構造的HTML內部DOM插入到shadow節點內即可。

定制元素的屬性

元素的屬性被稱為Attribute,JS對象內的屬性被稱為Property。代碼慣例上每一個Attribute都會有JS對象的一個Property對應。為了方便,我們希望添加的Attribute可以和JS內的Property同步。就是說,如果有人通過HTML DOM API修改了Attribute,那么我希望對于的JS屬性會被同步修改;反之亦然,有人修改了Property,那么這個修改可以會同步修改到對應的Attribute。

我們以spin-button的value屬性為例。定義一個普通的Property的方法是通過get/set關鍵字,比如定義value:

 get value(){}
 set value(newValue){}

隨后就可以使用object.value訪問此屬性值,或者通過object.value = newValue為屬性設置新值。可以在兩個函數內通過代碼設置和Attribute同步:

get value(){
    return this.getAttribute("value") || 1
}
set value(v){
    this.setAttribute("value",v)
}

這樣代碼內通過對屬性value的訪問,最后都會導致對Attribute的訪問。如果有代碼對Attribute訪問,如何修改Attribute的同時同步更新Property呢。這就需要利用HTMLElement提供的生命周期方法了:

static get observedAttributes() {
  return ["value"];
}
attributeChangedCallback(name, oldValue, newValue) {
  switch (name) {
    case "value":
      
      break;
  }
}

方法observedAttributes聽過返回值聲明需要觀察的屬性,這樣就可以在指定屬性清單發生更新時通過另一個生命周期方法attributeChangedCallback,通知代碼變化的情況。做響應的同步處理。整合后的代碼如下:

var template = `
    1
    
`
class SpinButton extends HTMLElement{
    constructor(){
        super()
        var shadow = this.attachShadow({mode:"open"})
        var t = document.createElement("template")
        t.innerHTML = template
        shadow.appendChild(t.content.cloneNode(true))
        var b1 = shadow.querySelector("[inc]")
        var b2 = shadow.querySelector("[dec]")
        this.s = shadow.querySelector("span")
        var i = 1
        var that = this
        b1.onclick = function(){
            that.s.innerHTML = ++that.value 
        }
        b2.onclick = function(){
            that.s.innerHTML = -- that.value 
        }
    }
    static get observedAttributes() {
      return ["value"];
    }
    attributeChangedCallback(name, oldValue, newValue) {
      switch (name) {
        case "value":
          this.s.innerHTML = newValue
          break;
      }
    }
    get value(){
        return this.getAttribute("value") || 1
    }
    set value(v){
        this.setAttribute("value",v)
    }
}
customElements.define("spin-button",SpinButton)
狀態

Web Components的關鍵構成技術包括Custom Element和Shadow DOM,最早在Chrome實現,第一個版本被稱為V0但是其他瀏覽器沒有跟進,因此逐步被廢棄。本文討論的是V1版本。Firefox也已經實現了V1版本。
可以在網站Whatcaniuse查詢當前支持狀態。

ref

Posts of wb

https://alligator.io/web-comp...

Custom Elements v1: Reusable Web Components

https://developers.google.com...
*3. web-components-examples
https://github.com/mdn/web-co...

Firefox 63 – Tricks and Treats!

https://hacks.mozilla.org/201...

HTML Web Component using Plain JavaScript

https://www.codementor.io/ayu...
6. Doing something with Web Components
https://medium.com/@dalaidunc...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99639.html

相關文章

  • Javascript模塊全攬

    摘要:要求模塊編寫必須在真正的代碼之外套上一層規定的代碼包裝,樣子看起來是這樣的模塊代碼通過傳遞一個簽名為的回調函數給函數,就可以把需要注入的變量和函數注入到模塊代碼內。 之前寫的文章急速Js全棧教程得到了不錯的閱讀量,霸屏掘金頭條3天,點贊過千,閱讀近萬,甚至還有人在評論區打廣告,可見也是一個小小的生態了;)。看來和JS全棧有關的內容,還是有人頗有興趣的。 showImg(https://...

    lily_wang 評論0 收藏0
  • PHPer 為什么會被 Javaer 鄙視?

    摘要:最近看了知乎上的一個話題在工作中,為什么程序員常常瞧不起程序員個人從業多年,用過的后端語言,如果你非要讓我說哪種語言好,我會說凡是宏哥說的都是對的,凡是宏哥提倡的都要堅持。只有真正的理解了宏哥思想才可以洞穿一切,走出空谷。 最近看了知乎上的一個話題「在工作中,為什么 Java 程序員常常瞧不起 PHP 程序員?」 個人從業多年,用過的后端語言 ASP、ASP.NET、Java、PHP、...

    jasperyang 評論0 收藏0
  • PHPer 為什么會被 Javaer 鄙視?

    摘要:最近看了知乎上的一個話題在工作中,為什么程序員常常瞧不起程序員個人從業多年,用過的后端語言,如果你非要讓我說哪種語言好,我會說凡是宏哥說的都是對的,凡是宏哥提倡的都要堅持。只有真正的理解了宏哥思想才可以洞穿一切,走出空谷。 最近看了知乎上的一個話題「在工作中,為什么 Java 程序員常常瞧不起 PHP 程序員?」 個人從業多年,用過的后端語言 ASP、ASP.NET、Java、PHP、...

    zhoutk 評論0 收藏0
  • Web Components(一)入門

    摘要:隨著頁面中相同或類似的增加,使得代碼冗余度增加,的重用性問題日益彰顯。影子使得這些與主文檔的保持分離。分離的原因是如果復雜頁面沒有很好的組織結構,樣式容易覆蓋。 為什么 Web Components? 早期在我們構建web頁面時,基本上都是通過組合HTML提供的標簽來實現的,再簡單點我們還可以拷貝黏貼bootstrap的css代碼。隨著頁面中相同或類似UI的增加,使得代碼冗余度增加,U...

    calx 評論0 收藏0

發表評論

0條評論

legendmohe

|高級講師

TA的文章

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