web 自定义标签
Web Components 标准非常重要的一个特性是,它使开发者能够将HTML页面的功能封装为 custom elements(自定义标签)。而自定义标签的好处,就是在大型web开发的时候,可以封装组件(Vue、Angular等大型框架)来重用,方便开发跟管理。
在自定义标签之前,先来看下几个相关的API:
- Object.create(proto, [propertiesObject]): 创建新对象,将该新对象的__proto__指向proto,这里的proto是 HTMLElement,因为我们需要创建一个element。主要是ES5的写法,ES6可以通过 Class 跟 constructor 来实现。
- document.currentScript.ownerDocument: 该方法主要针对通过 HTML import导入的文件,用于获取自定义element的上下文document,并通过该document 获取该 element 定义的html模板。因为document是指向全局上下文的,获取不到自定义的元素。document.currentScript: 获取正在执行的<script>脚本。
- createdCallback: 创建元素成功之后的回调函数。将自定义元素的模板添加到该元素下面。
- Element.createShadowRoot: 创建 shadow DOM,将该标签模板与外部元素隔离开来,不受外部样式影响,也不影响外部样式。不过MDN上将这个API废弃掉了,建议使用 attachShadow() 替代
- Element.attachShadow(shadowRootInit): createShadowRoot 的替代者。shadowRootInit: 指定shadowRoot的封装模式 {mode: open/closed}。open 表示可在外部 获取到该shadow,closed 反之。
- open: ele.shadowRoot === shadow
- closed: ele.shadowRoot === null
- document.registerElement(tag-name, options): 注册自定义元素。MDN已经废弃这个API了,建议使用 customElements.define() 替代
- tag-name: 自定义标签的名字,必须有一个连字符 '-'
- options: 指定标签的原型属性跟可扩展对象
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" href="./customized-tag.html">
<style type="text/css">
.red-color {
color: blue
}
</style>
</head>
<body>
<div class="red-color">aaa</div>
<customized-tag></customized-tag>
</body>
</html>
<template>
<div class="red-color">
hahaha
</div>
<style type="text/css">
/*.red-color {
color: red;
}*/
</style>
</template>
<script type="text/javascript">
(function() {
// 创建一个html元素
let ele = Object.create(HTMLElement.prototype);
// 获取当前文档的元素节点里面的内容
// 因为这个文件是通过 import 导入到父html的, document无法直接获取到自定义的模板
// document.currentScript 获取到当前的script,因为默认 document 是之前全局上下文的
// document.currentScript.ownerDocument 获取当前文档,而不是全局
let customizedDoc = document.currentScript.ownerDocument.querySelector('template').content;
ele.createdCallback = function() {
// 创建shadow DOM,避免元素相互影响,已废弃,建议使用 attachShadow
// let shadow = this.createShadowRoot(); // 创建shadow DOM, mode: open / closed, open 表示可以在js里面获取到该shadowDOM,closed 表示无法在外部获取到该shadow DOM
// open: ele.shadowRoot === shadow
// closed: ele.shadowRoot === null
let shadow = this.attachShadow({mode: 'open'});
// 拷贝节点,第二个参数表示是否导入后代节点
let clone = document.importNode(customizedDoc, true);
shadow.appendChild(clone); // 如果不想创建 shadowDOM, 可直接将节点append到父元素
// this.appendChild(clone)
}
document.registerElement('customized-tag', {
prototype: ele
})
})() </script>
使用 customElements.define(tag-name, constructor, options) 方式注册组件
class CustomizedTag extends HTMLElement {
constructor() {
super();
this.attachToTag();
}
attachToTag() {
let shadow = this.attachShadow({mode: 'open'})
let ele = document.currentScript.ownerDocument.querySelector('template').content;
let clone = document.importNode(ele, true);
shadow.appendChild(clone)
}
}
customElements.define('customized-tag', CustomizedTag)
web 自定义标签的更多相关文章
- Java Web 自定义标签
1. 自定义标签 由于在JSP页面中直接嵌入Java代码会导致页面开起来非常混乱,不方便和美工等配合工作,为此,JSP提供了自定义标签技术,可以代替直接嵌入Java代码的方式提供动态逻辑,但自定义 ...
- 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service ...
- Web学习之自定义标签
1.编写一个实现Tag接口的Java类(标签处理器类) package me.gacl.web.tag; import java.io.IOException; import javax.servle ...
- (转)java web自定义分页标签
转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...
- [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记41:简单标签之带属性的自定义标签(输出指定文件,计算并输出两个数的最大值 demo)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java Web开发技术教程入门-自定义标签
回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- EL函数以及自定义标签的应用
一.EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定,例如下: package cn.wzbril ...
随机推荐
- hdu-1536 S-Nim SG函数
http://acm.hdu.edu.cn/showproblem.php?pid=1536 给出能够取的方法序列,然后求基本石子堆问题. 只要用S序列去做转移即可. 注意has初始化的一些技巧 #i ...
- docker容器配置nginx负载均衡 -----加权
首先要准备三个nginx的容器: 第二个容器: 第三个容器: 进入第一个容器 要配置的容器(docker exec -it 容器名 /bin/bash) vi /usr/local/nginx/co ...
- Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器
原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...
- python web1(解析url)
环境:pycharm 尝试对地址进行切片 去掉头 http 或 https a.遇到了一些问题 url = 'https://www.cnblogs.com/derezzed/articles/811 ...
- SQL语句全解,非常棒!
链接自W3school非常详细的SQL教程 http://www.w3school.com.cn/sql/index.asp
- [CentOS 7] TexLive2017中kpsewhich Bug的修复
使用TexLive有一段时间了,从2015到2017,一直运行如常. 最近,想把以前的文档重新编译,却发现不能正常运行,费了好大一番工夫,才终于修复了这个bug,记录如下. 问题描述:编译一个简单的 ...
- Vue中的钩子
每个Vue实例被创建后都要经历初始化过程.在这个过程中也会运行一些叫做生命周期钩子的函数,方便用户在不同阶段进行不同的代码实现. 1.Created 在实例创建完成后立即执行的函数. <!DOC ...
- Android ORC文字识别之识别身份证号等(附源码)
项目地址https://github.com/979451341/OrcTest 我们说说实现这个项目已实现的功能,能够截图手机界面的某一块,将这个某一块图片的Bitmap传给tess-two的代码来 ...
- scrapy框架学习第一天
今天是学习的第一天: 知识总结如下: 1,调试器相当于原料出口地(URL提供) 2,scrapy相当于中间加工商(具有销售权利)封装URL为request(请求) 3,下载器使用request(请求) ...
- 笨办法40模块, 类和对象class
class a: def change(self, sign, call): self.first = sign self.second = call first = 'first' second = ...