Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

自定义元素(Custom Elements)

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

自定义元素是让您创建自定的HTML 标签(tags) 和 元素(elements)的功能。它们包含自己的脚本行为和CSS样式。它们是 Web Components 的一部分,也能为它们自己使用。

注意: 这是一项实验性的技术。2016年将对自定义元素的规范进行全面修订,修订结果很有可能与当前草案不兼容,届时您需要修改您的相关项目。

您可能会想,创建『自定义元素』这个新功能的原因是什么,毕竟现在已经能够创建名为<mytag>的标签,并且能用CSS制定样式,用脚本添加行为。其原因之一是,您能使用『生命周期回调(lifecycle callbacks)』,可以在新元素的生命周期中添加新行为。比如说, 您能在一个元素被插入DOM时添加行为,也能在其被移除DOM时添加另一个行为。

启用自定义元素关键在于 Document.registerElement() 方法,此方法向浏览器注册一个新元素,该元素默认使用 HTMLElement 接口(如果您创建了类似<mytag>的标签,但不注册,它将会使用 HTMLUnknownElement接口。您也可以在例如 <button> 这样的原生元素的基础上创建自定义元素,不过如此一来就不能使用自定义标签名,比如 <my-button> ,而要使用 <button is="my-button"> 这样的语法了)。

生命周期回调(Lifecycle callbacks)

自定义元素可以使用以下生命周期回调函数:

  • createdCallback - 注册元素时执行
  • attachedCallback - 元素插入DOM时执行
  • detachedCallback - 元素被移除DOM时执行
  • attributeChangedCallback - 元素的属性被增、删、改时执行

示例

自定义元素可用 Object.prototypeShadowRoot 相关技巧创建,如下 jsfiddle 所示:

在ES2015中创建自定义元素的一种简单方法是:使用 "Class" 而非 "ProtoType" ,此时可以不使用 "ShadowRoot"。

HTML文件:

If nothing appeared below, then your browser not supporting Custom Elements.
<x-product data-name="Ruby" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/ruby.png" data-url="https://example.com/1"></x-product>
<x-product data-name="JavaScript" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/javascript.png" data-url="https://example.com/2"></x-product>
<x-product data-name="Python" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/python.png" data-url="https://example.com/3"></x-product>

JS文件:

// Create a new object based of the HTMLElement prototype
var XProductProto = Object.create(HTMLElement.prototype);

// Set up the element.
XProductProto.createdCallback = function() {
    // Create a Shadow Root
    var shadow = this.createShadowRoot();

    // Create a standard img element and set it's attributes.
    var img = document.createElement('img');
    img.alt = this.getAttribute('data-name');
    img.src = this.getAttribute('data-img');
    img.width = '150';
    img.height = '150';
    img.className = 'product-img';

    // Add the image to the Shadow Root.
    shadow.appendChild(img);

    // Add an event listener to the image.
    img.addEventListener('click', function(e) {
        window.location = this.getAttribute('data-url');
    });
  
    // Create a link to the product.
    var link = document.createElement('a');
    link.innerText = this.getAttribute('data-name');
    link.href = this.getAttribute('data-url');
    link.className = 'product-name';

            // Add the link to the Shadow Root.
    shadow.appendChild(link);
};

// Register the new element.
var XProduct = document.registerElement('x-product', {
    prototype: XProductProto
});

CSS文件:

下例使用的 ::Shadow 已被弃用(deprecated)。

body {
  background: #F7F7F7;
}

x-product {
  display: inline-block;
  float: left;
  margin: 0.5em;
  border-radius: 3px;
  background: #FFF;
  box-shadow: 0 1px 3px rgba(0,0,0,0.25);
  font-family: Helvetica, arial, sans-serif;
  -webkit-font-smoothing: antialiased;
}

x-product::shadow .product-img {
  cursor: pointer;
  background: #FFF;
  margin: 0.5em;
}

x-product::shadow .product-name {
  display: block;
  text-align: center;
  text-decoration: none;
  color: #08C;
  border-top: 1px solid #EEE;
  font-weight: bold;
  padding: 0.75em 0;
}

这是上例的可执行版本:

规范(Specification)

自定义元素在下列规范中定义:

规范 状态 评论
Custom Elements Working Draft  

 

文档标签和贡献者

 此页面的贡献者: jchnxu
 最后编辑者: jchnxu,