精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web Components入門教程

移動開發
今天 ,Web 組件已經從本質上改變了HTML。初次接觸時,它看起來像一個全新的技術。Web組件最初的目的是使開發人員擁有擴展瀏覽器標簽的能力,可以自由的進行定制組件。

今天 ,Web 組件已經從本質上改變了HTML。初次接觸時,它看起來像一個全新的技術。Web組件最初的目的是使開發人員擁有擴展瀏覽器標簽的能力,可以自由的進行定制組件。面對新的技術,你可能會覺得無從下手。那這篇文章將為你揭開Web組件神秘的面紗。如果你已經熟知HTML標簽和DOM編程,已經擁有了大量可用 的Web組件,那么你已經是Web組件專家了。

Web組件的現狀

隨著各式各樣的用戶需求,瀏覽器的原生組件已經無法滿足需求。Web組件也就變得越來越重要。

我們將以自定義一個傳統三方插件為例來介紹Web組件。

首先,需要引用插件的CSS和JavaScript資源:

  1. <link rel="stylesheet" type="text/css" href="my-widget.css" /> 
  2.  
  3. <script src="my-widget.js"></script> 

接下來,我們需要向頁面中添加占位符。

  1. <div data-my-widget></div> 

***,我們需要使用腳本來找到并且實例化這個占位符為Web組件。

  1. // 使用 jQuery 初始化組件 
  2.  
  3. $(function() { 
  4.  
  5.     $('[data-my-widget]').myWidget(); 
  6.  
  7. }); 

通過以上是三個基本步驟。已經完成了在頁面中添加了自定義插件,但是瀏覽器無法確定自定義組件的生命周期,如果通過以下方式聲明則使自定義組件生命周期變得清晰了。

  1. el.innerHTML = '<div data-my-widget></div>'

因為這不是一個內置的組件,我們現在必須手動實例化新組件,

  1. $(el).find('[data-my-widget]').myWidget(); 

避免這種復雜設置方法的有效方式是完全抽象DOM交互。不過,這個動作也比較復雜,需要創建框架或者庫來自定義組件。

面臨的問題

組件一旦被聲明,占位符已經被替代為原生的HTML標記:

  1. <div data-my-widget> 
  2.  
  3. <div class="my-widget-foobar"> 
  4.  
  5. <input type="text" class="my-widget-text" /> 
  6.  
  7. <button class="my-widget-button">Go</button> 
  8.  
  9. </div> 
  10.  
  11. </div> 

這樣做的弊端是,自定義組件的標記和普通HTML組件的標記混雜在一起,沒有清晰的分割和封裝。這就不可避免的會出現命名及樣式等沖突。

Web組件的產生

隨著三方Web組件的發展,它已經成為了Web開發不可或缺的部分:

  1. <!—導入: --> 
  2.  
  3. <link rel="import" href="my-widget.html" /> 
  4.  
  5. <!—使用:--> 
  6.  
  7. <my-widget /> 

在這個實例中,我們通過導入HTML來添加組件并且立即使用。

更重要的是,因為<my-widget />是瀏覽器原生支持的組件,它直接掛在瀏覽器的生命周期中,允許我們像添加原生組件一樣添加三方組件。

  1. el.innerHTML = '<my-widget />'
  2.  
  3. // 插件當前已經被實例化 

當查看這個組件的HTML 源碼,你會發現它僅僅是一個單一的標簽。如果啟用瀏覽器Shadow DOM 特性,才可以查看標簽內的組件,你將會發現一些有趣的事情,

clip_image001[1]

當我們談論Web組件時,我們不是在談論一門新技術。Web組件最初的目的是給我們封裝能力,它可以通過自定義組件和Shadow DOM 技術來實現。所以,接下來,我們將著重介紹下這兩項技術。介紹以上兩個技術之前,我們***先梳理下已知瀏覽器原生組件。

已知的HTML組件

我們知道組件可以通過HTML標記或JavaScript來實例化:

使用標記實例化:

  1. <input type="text" /> 
  2. document.createElement('input'); 
  3. el.innerHTML = '<input type="text" />'

使用JaveScript實例化:

  1. document.createElement('input')  
  2.  
  3. document.createElement('div'

添加帶有屬性的HTML標簽:

  1. // 創建帶有屬性的input標簽... 
  2.  
  3. el.innerHTML = '<input type="text" value="foobar" />'
  4.  
  5. //這時value屬性已經同步 
  6.  
  7. el.querySelector('input').value; 

組件可以響應屬性的變化:

  1. // 如果我們更改value 屬性值 
  2. input.setAttribute('value', 'Foobar'); 
  3.  
  4. //屬性值會立即更改 
  5. input.value === 'Foobar'; // true 

組件可以有內部隱藏的DOM結構:

  1. <!—使用一個input實現復雜的日歷功能--> 
  2. <input type="date" /> 
  3.   
  4.  // 盡管其內部結構比較復雜,但是已經封裝成為一個組件 
  5. dateInput.children.length === 0; // true 

組件可以使用子組件:

  1. <!—可以給組件提供任意個 'option' 標簽--> 
  2.  
  3. <select> 
  4.  
  5. <option>1</option> 
  6.  
  7. <option>2</option> 
  8.  
  9. <option>3</option> 
  10.  
  11. </select> 

組件可以為其子組件提供樣式:

  1. dialog::backdrop { 
  2.  
  3.     background: rgba(0, 0, 0, 0.5); 
  4.  

***,組件可以有內置樣式。和自定義插件不同,我們不需要為瀏覽器的原生控件引用CSS文件。

有了以上的了解,我們已經具備了解Web組件的基礎。使用自定義組件和Shadow DOM,我們可以在我們的插件中定義所有這些標準行為。

#p#

自定義組件

注冊一個新組件也比較簡單:

  1. // 'document.register' 返回一個構造函器 
  2. var MyElement = document.register('my-element'); 

你也許注意到上面的自定義組件名稱包含一個連接符。這是為了確保自定義組件名稱不和瀏覽器內置組件不沖突。

現在<my-element />這個組件具備了原生組件的特性,

所以,自定義組件也同樣可以進行普通的DOM操作:

  1. document.create('my-element'); 
  2.  
  3. el.innerHTML = '<my-element />'
  4.  
  5. document.create('my-element'); 

構建自定義組件

當前,這個自定義組件僅僅有框架,而沒有內容,下面讓我們向其中添加一些內容:

  1. //我們將提供'document.register'的第二個參數: 
  2. document.register('my-element', { 
  3.   prototype: Object.create(HTMLElement.prototype, { 
  4.     createdCallback: { 
  5.       value: function() { 
  6.         this.innerHTML = '<h1>ELEMENT CREATED!</h1>'
  7.       } 
  8.     } 
  9.   }) 
  10. }); 

在這個例子中,我們設置自定義組件的prototype,使用Object.create 方法創建一個繼承于HTMLElement的對象。在這個方法中修改該組件的屬性 innerHTML。

我們定義了createdCallback方法,在每次聲明實例時調用。你同樣可以有選擇性的定義attributeChangedCallback、 enteredViewCallback 和leftViewCallback等方法。

目前為止我們實現了動態修改自定義組件內容的功能,我們仍然需要提供自定義組件的封裝方法,用于隱藏其內部組件。

#p#

使用Shadow DOM實現封裝

我們需要完善下createdCallback方法。本次,除了修改innerHTML之外,我們添加一些額外的操作:

  1. createdCallback: { 
  2.  
  3. value: function() { 
  4.  
  5. var shadow = this.createShadowRoot(); 
  6.  
  7. shadow.innerHTML = '<h1>SHADOW DOM!</h1>'
  8.  
  9.  

在這個例子中, 你會注意到‘SHADOW DOM!’,但是查看源碼時你會發現只有空白的<my-element /> 標簽而已。這里使用創建Shadow Root 方法替代了直接修改頁面。

Shadow Root中的任何組件,是肉眼可見的,但是和當前頁面的樣式和DOM API相隔離。這樣就實現了自定義組件是一個獨立組件的假象。

添加“輕量級DOM”

目前為止,我們的自定義組件是空標簽,但是如果向其中添加內部組件會出現什么現象呢?

我們假設自定義組件包含的節點如下,

  1. <my-element> 
  2.  
  3. 這是一個輕量級 DOM。 
  4.  
  5. <i>hello</i> 
  6.  
  7. <i>world</i> 
  8.  
  9. </my-element> 

一旦針對于這個組件的 Shadow Root 被創建,它的子節點不再存在。我們這些隱藏的子節點封裝為輕量級DOM節點。

如果禁用了 Shadow DOM,上面這個例子僅僅會顯示為:這是一個輕量級 DOM‘hello world’。

當我們在createdCallback方法中設置 Shadow DOM后,我們可以使用新增內容分配輕量級DOM組件到Shadow DOM 中。

  1. createdCallback: { 
  2.  
  3. value: function() { 
  4.  
  5. var shadow = this.createShadowRoot(); 
  6.  
  7. // 子組件'i' 標簽現在已經消失了 
  8.  
  9. shadow.innerHTML = 
  10.  
  11. ‘輕量級 DOM 中的 "i" 標簽為: ' + 
  12.  
  13. '<content select="i" />'
  14.  
  15. //現在,在 Shadow DOM 中只有 'i' 標簽是可以見的。 
  16.  
  17.  

封裝樣式

Shadow DOM 最重要的作用是創建了和當前頁面隔離的Web組件,使Web組件不受當前頁面樣式和JaveScript腳本的影響。

  1. createdCallback: { 
  2.  
  3. value: function() { 
  4.  
  5. var shadow = this.createShadowRoot(); 
  6.  
  7. shadow.innerHTML = 
  8.  
  9. "<style>span { color: green }</style>" + 
  10.  
  11. "<span>I'm green</span>"
  12.  
  13.  

反之,在 Shadow DOM 中定義的樣式也不會影響之外的標簽樣式。

  1. <my-element /> 
  2.  
  3. <span>I'm not green</span> 

#p#

揭露鉤子的秘密

當隱藏自定義組件內部標記,有時也需要在當前頁面對組件中的內部特定組件進行樣式設置。

例如,如果我們自定義一個日歷插件,在不允許用戶控制整個插件的情況下,允許最終用戶去定義按鈕的樣式。

這是其中的部分特性和偽組件:

  1. createdCallback: { 
  2.  
  3. value: function() { 
  4.  
  5. var shadow = this.createShadowRoot(); 
  6.  
  7. shadow.innerHTML = 'Hello <em part="world">World</em>'
  8.  
  9.  

這是在當前頁面設置自定義組件內部組件樣式的方法:

  1. my-element::part(world) { 
  2.  
  3. color: green; 
  4.  

這部分內容介紹了封裝web組件的基本方式。Shadow DOM 是我們可以任意修改Web組件中的標簽。在例子中,我們設置了“World”的樣式,但是使用者卻無法判斷它是<em>標簽。

在你嘗試自定義Web組件之前,需要確保瀏覽器的相關特性已經打開。如果使用 Chrome,在 Chrome 中打開chrome://flags ,并且開啟“experimental Web Platform features”。

clip_image003[1]

這僅僅是個開始

所有本文中介紹的內容,都是模擬一些簡單的瀏覽器標準行為。我們已經習慣于和原生的瀏覽器組件進行交互,因此自定義組件的步驟并不是想象中的那個難。Web組件最終提供我們一種實現簡單、一致、可復用、封裝和組合部件的方法,這是一個有意義的開始。

責任編輯:徐川 來源: cnblogs
相關推薦

2010-08-03 13:06:15

Flex Builde

2013-08-29 14:12:52

Storm分布式實時計算

2009-07-08 15:12:48

Java Servle

2024-02-26 09:13:35

WebComponents開源項目

2010-06-13 09:45:35

Widget開發

2013-08-29 14:28:09

StormHadoop

2010-07-27 15:53:15

2010-08-03 14:37:30

Flex入門教程

2010-05-21 12:50:45

Subversion快

2011-07-21 10:29:18

iPhone 開發

2024-11-12 15:46:37

2012-05-10 08:29:46

XcodeiOSPhoneGap

2011-09-02 10:59:10

jQuery Mobi

2010-06-18 16:56:50

UML建模語言

2018-03-22 14:59:13

Docker入門容器

2013-06-24 13:38:34

HTML5 DataList

2010-07-20 16:19:54

Perl

2022-06-16 07:31:41

Web組件封裝HTML 標簽

2022-09-21 21:50:18

Dapr消息隊列

2012-07-17 09:13:14

Scrapy
點贊
收藏

51CTO技術棧公眾號

色狠狠色噜噜噜综合网| 91首页免费视频| 久久成人国产精品| 少妇伦子伦精品无吗| 麻豆免费版在线观看| 国产精品网站导航| 国产九色91| 91av久久久| 亚洲一区亚洲| 欧美精品性视频| 在线观看国产精品一区| 欧美三级一区| 欧洲精品一区二区三区在线观看| 丁香婷婷综合激情| 日韩理伦片在线| 91丨porny丨中文| 99r国产精品视频| 乱子伦一区二区三区| 精品福利av| 自拍视频国产精品| 右手影院亚洲欧美 | 国产福利成人在线| 黄色一级片中国| 欧美综合另类| 亚洲九九九在线观看| 风韵丰满熟妇啪啪区老熟熟女| 51一区二区三区| 亚洲va欧美va人人爽| 免费观看国产视频在线| p色视频免费在线观看| 2019国产精品| 国外成人在线视频网站| 99热这里只有精品1| 久久 天天综合| 国产99视频精品免视看7| xxxx 国产| 欧美日韩精品一本二本三本 | 99热这里只有精品4| 亚洲综合小说图片| 日韩电视剧在线观看免费网站 | 国产午夜久久av| 欧美色图在线观看| 亚洲色图38p| 欧美大片免费| 日韩欧美在线国产| 国产a视频免费观看| h片在线观看视频免费免费| 亚洲一区视频在线| 国产欧美精品aaaaaa片| 欧美xxxx免费虐| 亚洲美腿欧美偷拍| 国产小视频免费| 牛牛电影国产一区二区| 亚洲一区在线视频| 日产精品久久久久久久蜜臀| 牛牛精品在线| 婷婷丁香激情综合| 北条麻妃在线视频观看| 国产精品伦理| 欧美性猛交xxxxxx富婆| 亚欧激情乱码久久久久久久久| 久久人体av| 91精品国产欧美一区二区18| 成人一区二区三区仙踪林| 日韩精品一区二区三区免费视频| 欧美一卡二卡在线| 丰满人妻一区二区三区免费视频棣| 日本免费精品| 亚洲精品第一页| 中文字幕高清视频| 99久久亚洲精品蜜臀| 久久亚洲私人国产精品va| 欧美日韩精品在线观看视频| 日韩视频在线一区二区三区 | 亚洲网站免费| 欧美大片一区二区三区| 亚洲av成人无码一二三在线观看| 亚洲警察之高压线| 丝袜美腿精品国产二区 | 色综合色狠狠天天综合色| 免费激情视频在线观看| 只有精品亚洲| 亚洲国产精品推荐| 手机看片国产日韩| 综合在线视频| 日韩av男人的天堂| 国产精品一级二级| 成人精品视频一区二区三区| 欧美极品色图| 91精品久久| 色久优优欧美色久优优| 91精品国产三级| 亚洲精品aaaaa| 久久亚洲国产精品成人av秋霞| 中文字幕在线观看免费视频| 久久成人精品无人区| 国产乱码一区| 看女生喷水的网站在线观看| 精品美女久久久久久免费| 手机版av在线| 宅男在线一区| 欧美激情精品久久久久久免费印度| 久久久久久久久黄色| 国产精品99久久久久久久女警| 看高清中日韩色视频| fc2ppv国产精品久久| 91久久线看在观草草青青 | 26uuu精品一区二区三区四区在线| 亚洲欧美日本国产有色| 日本а中文在线天堂| 欧美一区二区在线免费观看| 三区四区在线观看| 99精品国产在热久久| 亚洲va男人天堂| jizz在线免费观看| 欧美性jizz18性欧美| 69亚洲乱人伦| 亚洲一本二本| 国产女人精品视频| 黄色国产在线| 欧美日韩美女在线| 风韵丰满熟妇啪啪区老熟熟女| 欧美国产美女| 国产精品678| 欧美成熟毛茸茸| 五月天一区二区三区| 麻豆网站免费观看| 亚洲a在线视频| 国产精品私拍pans大尺度在线| 青青久在线视频免费观看| 性久久久久久久| 亚洲成a人片在线www| 亚洲五月综合| 亚洲综合色av| 在线āv视频| 欧美美女网站色| 精品少妇一区二区三区密爱| 青青草视频一区| 日本一区二区精品视频| 国产伦精品一区二区三区视频金莲| 国产999精品在线观看| 欧美美女一区二区在线观看| 我想看黄色大片| 日韩中文欧美在线| 日本成人三级电影网站| 成人影院入口| 国产亚洲精品久久久优势| 精品国产xxx| 国产日产欧美一区二区视频| 久久午夜夜伦鲁鲁一区二区| 精品视频日韩| 国产欧美一区二区三区视频| 免费网站看v片在线a| 欧美男同性恋视频网站| 91免费公开视频| 国产美女久久久久| 日韩欧美猛交xxxxx无码| 高潮按摩久久久久久av免费| 2020国产精品视频| 国产尤物视频在线| 欧美日韩一区久久| 国产极品国产极品| 成人sese在线| 97av视频在线观看| 成人久久久久| av中文字幕亚洲| 欧美视频免费看欧美视频| 人人精品视频| 国产精自产拍久久久久久蜜| av网址在线| 亚洲国产精品久久久久| 亚洲欧美一二三区| 国产精品免费aⅴ片在线观看| 天美一区二区三区| 制服诱惑一区二区| 香蕉久久免费影视| 欧美2区3区4区| 97在线视频免费播放| 久青草国产在线| 欧美一卡在线观看| 秋霞精品一区二区三区| 国产精品免费丝袜| 国产精品入口麻豆| 毛片不卡一区二区| 蜜桃传媒一区二区三区| 欧美一二区在线观看| 成人免费观看网站| 成人激情综合| 美女扒开尿口让男人操亚洲视频网站| 色婷婷av一区二区三区之e本道| 在线观看亚洲一区| 久久久精品一区二区涩爱| xfplay精品久久| 日韩av福利在线观看| 久久av一区| 男人天堂网站在线| 不卡在线一区| 精品国产乱码久久久久久久软件| www.精品国产| 欧美最猛黑人xxxx黑人猛叫黄| gogogogo高清视频在线| 亚洲欧美一区二区精品久久久| 国产免费一区二区三区免费视频| 日韩欧美精品网址| 久久久久久国产精品免费播放| 国产日韩欧美制服另类| 日本一区二区在线观看视频| 激情综合色播激情啊| 欧美精品一区二区三区免费播放| 欧美全黄视频| 亚洲一区二区三区午夜| 天堂在线视频观看| 日韩电影网1区2区| 国产免费一区二区三区四在线播放 | 涩涩视频免费看| 在线播放中文一区| 天堂а√在线中文在线新版| 一区二区成人在线| fc2ppv在线播放| 国产欧美精品日韩区二区麻豆天美| 亚洲色图欧美日韩| 国产精品99久久久久| 国模私拍视频在线观看| 日韩在线一二三区| 国产美女无遮挡网站| 99精品福利视频| 欧妇女乱妇女乱视频| 国产精品国内免费一区二区三区| 日本高清一区| 亚洲欧美日本伦理| 精品乱子伦一区二区三区| 91久久偷偷做嫩草影院电| 亚洲va男人天堂| 九九99久久精品在免费线bt| 国产欧美在线观看| 四虎国产精品免费久久5151| 国产精品午夜视频| 国产 日韩 欧美一区| 国产a级全部精品| 国产精品专区免费| 国产91免费看片| 午夜无码国产理论在线| 国产不卡在线观看| 一区在线影院| 国产精品亚洲激情| 成人国产精品入口免费视频| 国产精品久久综合av爱欲tv| 美女色狠狠久久| 国产精品一区二区三区成人| 亚洲二区av| 91免费国产视频| 视频二区欧美| 好吊色欧美一区二区三区| 免费成人蒂法| 欧美污视频久久久| 日韩欧美二区| 精品国产无码在线| 欧美午夜一区| 97免费视频观看| 国产精品腿扒开做爽爽爽挤奶网站| 国产男女在线观看| 日本欧美一区二区三区乱码| 欧美成人黄色网址| 精品一区二区三区免费播放| 成年人网站av| caoporn国产精品| 亚洲码无人客一区二区三区| 国产精品免费av| 欧美又粗又大又长| 欧美视频精品一区| 中文字幕第31页| 日韩精品一区二区三区中文精品| 人妻va精品va欧美va| 亚洲欧美制服综合另类| 日本电影全部在线观看网站视频| 久久成人亚洲精品| 高清精品在线| 国产精品一区二区电影| 天堂av一区| 欧美视频1区| 亚洲色图88| 国产精品欧美激情在线观看| 久久精品国产网站| www男人天堂| 中文字幕不卡在线观看| 青娱乐在线视频免费观看| 一本大道久久a久久精二百| 一级特黄色大片| 亚洲精品av在线播放| av在线天堂| 韩国欧美亚洲国产| 日本一区二区中文字幕| 国产一区免费视频| 久久理论电影| 久久黄色片视频| 国产自产高清不卡| 日本黄色网址大全| 亚洲一区在线观看网站| 亚洲精品毛片一区二区三区| 欧美变态tickle挠乳网站| 波多野结衣在线影院| 欧美激情亚洲视频| 久久99国产精品二区高清软件| 国产精品一区二区a| 天天操夜夜操国产精品| 国模杨依粉嫩蝴蝶150p| 成人免费毛片片v| 少妇高潮在线观看| 色综合久久天天| 好吊视频一二三区| www.亚洲一区| 亚洲成av在线| 久久人人九九| 亚洲视频久久| 91香蕉视频免费看| 国产精品女主播在线观看| 欧美一区二区激情视频| 精品国产乱码久久| 国内精品不卡| 国产主播在线一区| 奇米色欧美一区二区三区| 欧美日韩一道本| 成人午夜私人影院| 91在线播放观看| 欧美日韩高清一区二区| 国产色a在线| 日本久久久久亚洲中字幕| 卡通动漫国产精品| www.日本在线视频| 丁香六月综合激情| 成人黄色短视频| 欧美色成人综合| 国产69久久| 国产成人综合亚洲| 欧美日韩有码| 中文字幕第21页| 国产日韩在线不卡| 这里只有精品免费视频| 亚洲桃花岛网站| 影音成人av| 亚洲国产激情一区二区三区| 日韩成人免费看| 五月天精品在线| 欧美三级日韩在线| 91网页在线观看| 国产欧美日韩视频| 99视频精品全国免费| 国产传媒免费观看| 亚洲欧洲美洲综合色网| 99精品在线看| 欧美劲爆第一页| 国产精品qvod| 国产综合av在线| 久久久国际精品| 夜夜躁日日躁狠狠久久av| 中文字幕亚洲一区| 日韩国产大片| 少妇一晚三次一区二区三区| 成人高清视频免费观看| 午夜影院在线看| 国产亚洲精品久久久久久| 日韩毛片网站| 久久久久久久久影视| 不卡免费追剧大全电视剧网站| 国产精品久久久久久久久久久久久久久久久| 亚洲美女视频网站| 日韩av电影资源网| av影院在线播放| 99久久免费国产| 中文天堂在线播放| 久久综合五月天| 久久人人爽人人爽人人片av不| 37pao成人国产永久免费视频| 国产欧美一区二区在线| 国产精品无码免费播放| 久久久久久久97| 国产一区二区三区网| 亚洲va在线va天堂va偷拍| 亚洲一区二区成人在线观看| 日本一卡二卡四卡精品| 成人免费视频网址| 一本久道久久久| 欧美性猛交xxxx乱大交少妇| 精品精品国产高清一毛片一天堂| 看黄在线观看| 在线综合视频网站| 成人黄色av电影| 中文字幕一二区| 国模视频一区二区三区| 教室别恋欧美无删减版| 中文字幕无码毛片免费看| 精品女厕一区二区三区| 国产福利在线播放麻豆| 久久久7777| 国产麻豆精品久久一二三| caoporn国产| 欧美激情一区二区三区成人| 精品国精品国产自在久国产应用| 日日夜夜精品视频免费观看| 日本道精品一区二区三区|