javascript DOM 操作自定义创建HTML代码实例

创建自定义的HTML元素

我们可以使用 document.registerElement() 创建自定义的HTML元素,这个函数返回的是一个构造函数,第一个参数是用来声明自定义HTML元素的名称,第二个参数是可选的,用来描述原型的对象,自定义功能的元素。

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

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

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

<x-treehouse></x-treehouse>

自定义元素的名称必须使用连字符-,这样浏览器就可以区分标准元素和自定义元素。这也意味着,你不会遇到一个新的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元素的功能。比如我们可以扩展<img>元素来创建一个带变量的缩略图显示。

像之前那样先创建一个对象原型。不过这次,是从现有的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'
});

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

<img is="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-属性来完成。

<x-product data-name="Product Name" data-img="image.png" data-url="http://example.com"></x-product>

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

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

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

// 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不熟悉,可以先阅读之前的文章。然后创建一个<img>元素,并设置其alt、src、width和height属性指定x-product元素的一些信息。

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

接下来将<img>和<a>元素添加到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;
}

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

<x-product data-name="Ruby" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/ruby.png" data-url="http://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="http://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="http://example.com/3"></x-product>

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

全部实例代码

HTML

<x-product data-name="Ruby" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/ruby.png" data-url="http://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="http://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="http://example.com/3"></x-product>

CSS

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;
    }

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
});

浏览器支持自定义HTML元素

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

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

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

总结

通过本文的学习,相信你已经了解到如何使用js创建自定义HTML元素,还看到了如何使用自定义元素和Shadow DOM知识构建Web组件。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 函数
, this
, prototype
, 属性
原型
javascript 创建dom、javascript dom、javascript dom操作、javascript dom是什么、javascript dom bom,以便于您获取更多的相关知识。

时间: 2024-09-08 22:00:06

javascript DOM 操作自定义创建HTML代码实例的相关文章

JavaScript DOM操作表格及样式_基础知识

一 操作表格 <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; // 使用DOM来创建表格; var table = document.createElement('table'); table.border = 1; table.width = 300; var caption = document.createElement('caption'); table.appendChild(caption); caption.appe

JavaScript——DOM操作——Window.document对象详解_javascript技巧

一.找到元素:     docunment.getElementById("id"):根据id找,最多找一个:     var a =docunment.getElementById("id");将找到的元素放在变量中:     docunment.getElementsByName("name"):根据name找,找出来的是数组:     docunment.getElementsByTagName("name"):根据标签

javascript dom 操作优化

DOM 操作优化 首先澄清两个概念--Repaint 和 Reflow:Repaint 也叫 Redraw,它指的是一种不会影响当前 DOM 的结构和布局的一种重绘动作.如下动作会产生 Repaint 动作: 不可见到可见(visibility 样式属性); 颜色或图片变化(background, border-color, color 样式属性); 不改变页面元素大小,形状和位置,但改变其外观的变化 Reflow 比起 Repaint 来讲就是一种更加显著的变化了.它主要发生在 DOM 树被操

JavaScript DOM操作表格及样式

 一 操作表格 <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // 使用DOM来创建表格; var table = document.createElement('table'); table.border = 1; table.width = 300;   var caption = document.

javascript dom 操作详解 js加强_javascript技巧

1 .文档里的每个节点都有属性 nodeName . nodeValue . nodeType nodeName 文本节点的的节点名是 #text , nodeName 是只读属性 nodeValue 1 元素节点 2 属性节点 3 文本节点 只读属性 nodeType 不能用于元素节点 返回 null 2 . getElementsByTagName 返回一个节点集合 3 . firstChild . lastChild 第一个元素节点,最后一个元素节点 4 . childNodes 返回所有

[DOM]javascript DOM操作

对于B/S开发,客户端与服务器端的交互是非常必要的,JavaScript的提出解决了很多问题,AJAX的提出也解决了异步通信的问题,更加为用户着想了.而DOM是其中非常基础的知识,在学习AJAX的同时,我学习了一下DOM的相关操作,这篇重点讲一下HTML DOM的相关内容,其实就是在HTML网页上进行的各种操作.           一,概述: DOM(对象文档模型(Document Object Model)),是W3C组织推荐的处理可扩展置标语言的标准编程接口.DOM可以以一种独立于平台和语

Android中创建快捷方式代码实例_Android

1.添加权限(必须) 复制代码 代码如下: <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> 2.添加快捷键 复制代码 代码如下:     public static void setupShortcut(Activity activity)     {         Intent shortcutIntent = new Intent(activity,

javascript cookie操作类的实现代码小结附使用方法_javascript技巧

第一种方法:cookie操作类,代码封装了,下面也有使用方法,大家可以参考下. 复制代码 代码如下: String.prototype.Trim = function() { return this.replace(/^\s+/g,"").replace(/\s+$/g,""); } function JSCookie() { this.GetCookie = function(key) { var cookie = document.cookie; var coo

javascript DOM 操作 childNodes 详解

定义和用法 childNodes 属性返回节点的子节点集合,以 NodeList 对象. 提示:您可以使用 length 属性来确定子节点的数量,然后您就能够遍历所有的子节点并提取您需要的信息. 浏览器支持 所有主流浏览器都支持 childNodes 属性. 语法 element.childNodes 技术细节 返回值:     NodeList 对象,表示节点集合.DOM 版本     Core Level 1 以上是定义来着w3cschool.com DOM中节点的类型 DOM中一共有12中