什么是Web Component?

Web Components 包含了多种不同的技术。你可以把Web Components当做是用一系列的Web技术创建的、可重用的用户界面组件的统称。Web Components使开发人员拥有扩展浏览器标签的能力,可以自由的进行定制组件。但截至本文时间,Web Components依然是W3C工作组的一个草案,并为被正式纳入标准,但这并不妨碍我们去学习它。

Web组件

何为Web组件?Web组件相对于Web开发者来说并不陌生,Web组件是一套封装好的HTML,CSS,以及JavaScript,它最大的特点就是可复用。基本在每一个网站上我们都可以看到各式各样的组件,例如下拉菜单、按钮、图片滚播、日历控件等。慢着,既然我们已经可以实现web组件的封装,那Web Component这家伙出现的意义是什么呢?Web Component回答道:“你们的实现方式不够优雅也不够完美,还是看看我的吧”。

因为当我们使用各种编程技巧对组件进行封装时,一个无法规避的事实是,组件的内部是可被访问和影响的,例如我们对样式表进行改动时经常会担心影响到页面组件的样式。而通过Web Component封装出来的组件,我们可以选择让组件的内部隐藏起来,也就是说,组件内部是与世隔绝的!

Web Component的组成

  • Custom Elements
  • HTML Templates
  • Shadow Dom
  • HTML Imports

总的来说,Web Components包含以上四种技术,本文着重谈谈Custom Element,这也是Web component中最核心的部分。

Custom Elements

自定义元素是一个可由创建者来自定义接口的对象。在创建时我们需要通过 document.registerElement() 来对自定义元素进行注册。该方法会返回一个元素的构造器,通过该构造器我们就可以创建我们的自定义元素的实例了。

var MyButton= document.registerElement('my-button');
document.body.appendChild(new MyButton());

实际上 document.registerElement(tag-name, prototype) 包含两个参数:

tag-name: 自定义元素的标签名,这个标签名必须包含连字符'-',这样做的母的是用以区分自定义元素和HTML规范的元素

prototype: 这是一个可选的参数,用于描述该元素的原型,在该元素中你可以为自定义元素进行接口的定义

var MyElement = document.registerElement('my-element', {
prototype: Object.create(HTMLElement.prototype, {
createdCallback: {
value: function() {
this.innerHTML = "<p>I'm a Custom Element</p>";
}
}
})
});
document.body.appendChild(new MyElement())

在上面的例子中,我们通过Object.create()方法创建了一个继承自HTMLElement的对象作为自定义对象的原型,并设置了元素默认的 innerHTML ,如果你对Object.create()方法的第二个参数不熟悉,你最好先去查阅一下。实际上它的上面的例子跟下面给出的写法的效果是一样的:

var MyElementProto = Object.create(HTMLElement.prototype)

MyElementProto.createdCallback = function() {
this.innerHTML = "<p>I'm a Custom Element</p>"
} var MyElement = document.registerElement('my-element', { prototype: MyElementProto }) document.body.appendChild(new MyElement())

接着,在页面上我们可以看到渲染出如下结构:

自定义元素的生命周期

在上面的例子中我们可以看到自定义元素的原型上有一个 createdCallback 属性,它的值是一个回调函数,在自定义元素被创建的时候被调用。实际上自定义元素在它的生命周期中可能会经历以下几种变化:

  • 自定义元素在其注册前被创建
  • 自定义元素被注册
  • 自定义元素的实例在自定义元素注册后被创建
  • 自定义元素被插入到文档中
  • 自定义元素从文档中移除
  • 自定义元素的属性被创建、移除、修改

在自定义元素经历上面某些变化时,不同的回调函数会被调用。这些回调函数被保存在一个名为生命周期回调的键值对集合中。我们可实现的回调函数总共有以下4种,其中 attributeChangedCallback 的回调函数中我们可以通过其参数访问到操作的属性名、老的属性值、新的属性值。

DOM:

<div id="modify">
<label class="CEgreen"><input type="radio" name="CEclass" value="green">green box</label>
<label class="CEred"><input type="radio" name="CEclass" value="red">red box</label>
</div>

JS:

var MyElement = document.registerElement('my-element', {
prototype: Object.create(HTMLElement.prototype, {
createdCallback: {
value: function() {
this.innerHTML = "<span>I'm a Custom Element</span>"
}
},
attributeChangedCallback: {
value: function(property, oldValue, newValue) {
this.innerHTML = "attribute '" + property + "' is modified to " + newValue
}
}
})
})
document.body.appendChild(new MyElement()) var temp = document.querySelector("#modify")
var myElement = document.querySelector("my-element") temp.addEventListener('click', function(e){
console.log(e.target.value)
myElement.className = e.target.value
})

另外,给自定义元素添加样式和普通元素是一样的,这是上面例子中为自定义元素添加的样式:

my-element {display: inline-block;margin-top: 20px;padding: 10px;font-size: 24px;}

这就是一个最基础的自定义元素的实现了。如果我们希望自定义元素内部不受外部样式的影响,我们需要使用Shadow Dom来对内部dom结构和样式进行封装。

Web Components之Custom Elements的更多相关文章

  1. web components & publish custom element & npm

    web components & publish custom element & npm https://www.webcomponents.org/publish Polymer ...

  2. [Angular 8] Take away: Web Components with Angular Elements: Beyond the Basics

    This post is based on the NG-CONF talk, check the talk by yourself. 1. Dynamiclly add Angular Elemen ...

  3. The state of Web Components

    Web Components have been on developers’ radars for quite some time now. They were first introduced b ...

  4. 【转】Facebook React 和 Web Components(Polymer)对比优势和劣势

    原文转自:http://segmentfault.com/blog/nightire/1190000000753400 译者前言 这是一篇来自 StackOverflow 的问答,提问的人认为 Rea ...

  5. Polymer——Web Components的未来

    什么是polymer? polymer由谷歌的Palm webOS团队打造,并在2013 Google I/O大会上推出,旨在实现Web Components,用最少的代码,解除框架间的限制的UI 框 ...

  6. 前端应该知道的Web Components

    前端组件化的痛点 在前端组件化横行的今天,确实极大的提升了开发效率.不过有一个问题不得不被重视,拟引入的这些html.css.js代码有可能对你的其他代码造成影响. 虽然我们可以通过命名空间.闭包等一 ...

  7. 一个使用 Web Components 的音乐播放器: MelodyPlayer

    先上效果预览: Web Components 首先,什么是 Web Components ? MDN 给出的定义是: Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的 ...

  8. 学习web components

    javascript里的两种组件 1 autonomous custom elements 一般extends HTMLElement, 可以通过<popup-info>或doducmen ...

  9. 腾讯发布新版前端组件框架 Omi,全面拥抱 Web Components

    Omi - 合一 下一代 Web 框架,去万物糟粕,合精华为一 → https://github.com/Tencent/omi 特性 4KB 的代码尺寸,比小更小 顺势而为,顺从浏览器的发展和 AP ...

随机推荐

  1. 问问题_Java一次导出百万条数据生成excel(web操作)

    需求:在web页面操作,一次导出百万条数据并生成excel 分析: 1.异步生成Excel,非实时,完成后使用某种方式通知用户 2.生成多个excel文件,并打包成zip文件,因为一个excel容纳不 ...

  2. java 关键字 transient

    一个对象实现了Serilizable 接口,该对象就可以被序列化. 然而在实际开发工程中,我们会遇到,这个类的有些属性不需要序列化,比如包含用户的敏感信息(如密码),为了安全起见,不希望在网络操作(主 ...

  3. Python 之我见

    读音 Python(KK 英语发音:/ˈpaɪθən/) 序言 其实早前就已经接触了python这个功能强大的脚本语言,但是那时只是基于兴趣而学习,目的性并不是很强,所以学习的并不是很深入.最近由于闲 ...

  4. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  5. jdbcTemplate的配置

    相关jar 包 package sfk.bbs.test.springjsbctempletTest; import static org.junit.Assert.*; import java.sq ...

  6. 【poj3714】 Raid

    http://poj.org/problem?id=3714 (题目链接) 现在才搞平面最近点对..感觉有点尴尬 题意 给出平面上两组点,每组n个,求两组点之间最短距离 Solution1 平面最近点 ...

  7. 移动H5页面,keyup事件不好使用处理解决

    1.mouse事件换成touch,pointer事件,keyup换成textInput事件

  8. POJ2823 Sliding Window

    Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 53086   Accepted: 15227 Case Time Limi ...

  9. BZOJ1113 海报PLA

    好像是很古老的题?现在BZOJ上找不到该题,所以没有提交. 1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8 ...

  10. C#通过编程方式实现Ping

    代码是照着书敲的,贴出来方便平时参考 using System; using System.Collections.Generic; using System.Linq; using System.T ...