如何创建自定义的HTML元素 您所在的位置:网站首页 web自定义标签 如何创建自定义的HTML元素

如何创建自定义的HTML元素

2023-04-19 21:57| 来源: 网络整理| 查看: 265

HTML规范有一个令人感到兴奋的功能可以自己自定义HTML元素。这允许你可以根据自己的JavaScript API创建自己的HTML元素。这在整个应用程序中构建接口和组件重用可能是非常有用的。

在这篇文章中你可以学习到如何自定义自己的HTML元素和定义他们需要的JavaScript API。

我们开始吧。

创建自定义的HTML元素

document.registerElement()函数用来创建自定义的HTML元素。它将返回一个构造函数,其中有一个参数选项,用来声明自定义HTML元素的名称,另外有一个可选参数项,用来描述原型的对象,自定义功能的元素。

在下面的示例中,简单的创建了一个新的HTML元素,并且将它放入到页面中:

var XTreehouseElement = document.registerElement('x-treehouse'); document.body.appendChild(new XTreehouseElement());

下面的HTML就会插入元素内:

自定义元素的名称必须使用连字符-,这样浏览器就可以区分标准元素和自定义元素。这也意味着,你不会遇到一个新的HTML元素和你自己定义元素使用相同名称的问题。

给自定义元素创建JavaScript API

可以给自定义元素创建一个JavaScript API,这样自定义元素就具备一系列的方法和属性。要做到这一点,首先需要创建一个JavaScript对象。可以通过使用Object.create()方法。将HTMLElement.prototype传给这个方法,创建一个对象。这个对象和标准的HTML的方法和属性相同。

var XTreehouseProto = Object.create(HTMLElement.prototype);

可以像下面这样,在这个新对像上定义你的需要的方法:

XTreehouseProto.hello = function(){ alert('Hello!'); }

使用Object.defineProperty()方法给自定义元素定义一个属性。这个方法的第一个参数是需要定义属性的对象,第二个参数是需被定义或修改的属性名,第三个参数是需被定义或修改的属性的描述符。在这里你可以设置一个默认值指定属性是可写还是可读。

Object.defineProperty(XTreehouseProto, 'badges', { value: 20, writable : true });

一旦给自完义元素定义好API,需要通过document.registerElement()来调用。使用自定义元素的名称作为第一个参数,然后给对象设置为一个名为prototype的属性。这个属性的值应该设置您在前面创建好的原型对象。

var XTreehouseElement = document.registerElement('x-treehouse', { prototype: XTreehouseProto });

一旦注册自定义元素,可以创建一个新元素,并将其添加到页面中。

var xtreehouse = new XTreehouseElement(); document.body.appendChild(xtreehouse);

可以像其他的HTML元素一样使用前面定义好的方法和属性。

xtreehouse.hello(); var badges = xtreehouse.badges; 扩展现有的元素

正如创建的自定义元素,还可以使用registerElement()方法来扩展现有的HTML元素的功能。比如我们可以扩展元素来创建一个带变量的缩略图显示。

像之前那样先创建一个对象原型。不过这次,是从现有的HTML元素上来扩展对象原型。在这个示例中,扩展的是HTMLImageElement。

var ThumbImageProto = Object.create(HTMLImageElement.prototype);

接下来使用createCallback定义一个函数(回调函数),在创建元素时就定义了图像的width和height。

ThumbImageProto.createdCallback = function() { this.width = '100'; this.height = '100'; };

还可以自定义自己的属性和方法:

ThumbImageProto.changeImage = function() { this.src = 'new-image.jpg'; };

当你想扩展元素时,在document.registerElement()创建元素时,可以通过给对象添加extends属性。这个属性的属性值就是你需要扩展的元素名称。

var ThumbImage = document.registerElement('thumb-img', { prototype: ThumbImageProto, extends: 'img' });

要使用自定义元素,可以给元素指定一个属性来扩展元素。这个属性的值是自定义的元素名称,可以告诉浏览器使用了自定义的API:thumb-img。

自定义元素回调方法

创建和管理自定义元素时有很多回调方法可使用:

createdCallback: 元素创建后调用 attachedCallback: 元素附加到文档后调用 detachedCallback: 从文档中移除元素后调用 attributeChangedCallback(attrName, oldValue, newValue): 元素任一属性变更后调用

指定这些回调函数的原型对象,并传递给document.registerElement()。

var XTreehouseProto = Object.create(HTMLElement.prototype); XTreehouseProto.createdCallback = function() {} XTreehouseProto.attachedCallback = function() {} XTreehouseProto.detachedCallback = function() {} XTreehouseProto.attributeChangedCallback = function(attrName, oldValue, newValue) {} var XTreehouse = document.registerElement('x-treehouse', { prototype: XTreehouseProto }); 使用Shadow DOM创建自定义元素

自定义元素真正的威力就是如何和Shadow DOM一起使用。使得它很容易创建可重用的组件。

在接下来的内容中将看看如何使用Shadow DOM自定元素,来创建一个网上商店可展示的商品。这里的想法是,Web开发人员可通过添加一行HTML标签来轻松的创建产品。需要显示的产口所有信息都通过自定义的data-属性来完成。

首先基于HTMLElement.prototype创建一个新的原型对象。

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

接下来,我们需要设置一个createdCallback函数。我们将要创建一个和元素,用来显示产品。先把代码展示一下,再详细介绍:

// Set up the element. XProductProto.createdCallback = function() { // Create a Shadow Root var shadow = this.createShadowRoot(); // Create an 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); };

首先创建一个新的Shadow DOM。如果你对Shadow DOM不熟悉,可以先阅读之前的文章。然后创建一个元素,并设置其alt、src、width和height属性指定x-product元素的一些信息。

注:回调函数,this指的是自定义元素的标记。

接下来将和元素添加到Shadow root下面。并设置元素的属性值从自定义元素的data-属性获取。

现在我们需要注册自定义元素,并且将x-product元素传给document.registerElement(),同时指定对象原型为XProductProto:

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

为了让项目展示更好,需要添加一些CSS代码:

x-product { display: inline-block; float: left; margin: 0.5em; border-radius: 3px; box-shadow: 0 1px 3px rgba(0,0,0,0.3); 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; }

为了显示产品,我们需要将元素添加到HTML模板中。使用data-name,data-img和data-url属性指定产品相关数据。当页面加载时,自定义元素就会通过createCallback来调用它们。

就是这样,你现在已经使用Shadow DOM自定义了一个元素,显示一系列的产品。

浏览器支持自定义HTML元素

Chrome 33+和Opera支持自定义元素。然而有一个强大的polyfill可以让其他的浏览器,比如说Polymer和X-tags。

可以使用registerElement()方法检测document对象是否被浏览器支持:

if ('registerElement' in document) { // Supported. } else { // Not supported. } 总结

在这篇文章中,你已经了解了如何创建自定义HTML元素,还看到了如何使用自定义元素和Shadow DOM知识构建Web组件。

自定义元素使用Web开发人员能更好的制作组件,更好地满足他们的需求。自定义元素和Shadow DOM是Web组件中的一部分,Web组件中引入这些新技术,前端Web应用程序得到飞跃性的发展。

扩展阅读 HTML5 Rocks: Custom Elements Web Components: A Tectonic Shift for Web Development Polymer x-tags Polyfill

本文根据@Kenny Louie的《How to Create Custom HTML Elements》所译,整个译文带有我们自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://blog.teamtreehouse.com/create-custom-html-elements-2。

大漠常用昵称“大漠”,W3CPlus创始人,目前就职于手淘。中国Drupal社区核心成员之一。对HTML5、CSS3和Sass等前端脚本语言有非常深入的认识和丰富的实践经验,尤其专注对CSS3的研究,是国内最早研究和使用CSS3技术的一批人。CSS3、Sass和Drupal中国布道者。2014年出版《图解CSS3:核心技术与案例实战》。

如需转载,烦请注明出处:http://www.w3cplus.com/web-components/create-custom-html-elements-2.htmlZoom Kobe Elite High



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有