web Components 学习之路
就目前而言,纯粹的Web Components在兼容性方面还有着较为长远的路,这里做个记录总结,以纪念自己最近关于Web Components的学习道路。
参考教材
Web Components由HTML Import、Template、Custom Element、Shadow DOM四种技术规范。上面的三个文件,是我这次学习的主要参考,其中前两个教材引领我入门,学习了HTML import、Template、shadowDOM以及custom Element的相关知识;而第三个github上的资源则是一个比较完善的综合使用web Components实现的一个小例子。这里,最后,我也会给出自己学习制作的一个弹层的组件小例子。
HTML Import
作用:HTML Import将外部的html引入,引入的文档全局有效。其用途有二:一是将整个项目所有的公共的css和js引用都放在一个html页面里,需要时直接引用这个html文档即可;二是将写好的组件放入一个html文档中,需要时直接引用这个html文档;
用法: 被引用html页面不需要操作,引用页面需要加入link标签
<link rel="import" href="xxx.html" />
这时被引入的文档内容只会被主文档存储起来,不会显示在页面中,需要手动添加到DOM结构中。将被引用文档内容添加到DOM结构中,需要先获取其link值的import,再通过其获得对应子文档的DOM结构,将其引入。格式如下:
//子文档 importSub.html
<h1>hello world!</h1>
//主文档 importMain.html
<head lang="en">
<link rel="import" href="importSub.html"/>
</head>
<body>
<script>
//获取到子文档在本文档对应的引用——即子文档在本文档的"代言人";
var s = document.querySelector('link[rel="import"]').import;
//获取子文档要被插入的DOM;
var t = s.querySelector('h1');
//插入到主文档中;
document.body.appendChild(t);
</script>
</body>
Template模板
template里可以存放html,css,js;
template本身及其内部的css、js、html不会被浏览器加载的,包括其中的格式;
引入的时候先获取到模板,再复制模板的content,将其插入dom结构中;模板的作用在于可重用,每次的使用都需要复制模板的content,插入DOM中;模板的复制可以采用cloneNode,也可以采用importNode,推荐importNode;格式为
var x=document.importNode(content,true)
或者var x = content.cloneNode(true)
移除模板
document.querySelector('template').remove();
Template模板所定义的css样式和js可被外界干扰,封装性不好,通常多与shadowDOM组合;
格式
<div class="container"></div>
<template>
<style>
span{color:red;}
</style>
<span>hello</span>
<script>
console.log(1);
</script>
</template>
<script>
//通过模板选择器获取到模板,再选择其内容;
var m = document.querySelector('template').content;
//两种克隆模板内容的方法
var s = document.importNode(m,true);
// var s = document.importNode(m,true);
//将克隆结果插入到dom结构中;
document.querySelector('.container').appendChild(s);
</script>
</body>
</html>
shadowDOM
shadowDOM,形成一个封闭的空间;将内部的html、css、js与外部隔离,不受干扰。其中,DOM结构中的元素是代言人,被爬虫爬取,而shadowDOM则是真正的DOM,用于展示内容,不会被爬取。多与template组合使用,使template内的css、js不受外界干扰。
shadowDOM内的模板可以通过
:host{}
来修改其外部容器的css样式,在外部也可以通过选择器::shadow 选择器击穿
修改shadowDOM内的css样式; 优先级依照元素选择器的优先级进行比较,来决定是否能够修改template内部的样式;格式
// 给class为container的div创建一个shadowDOM;
var shadow = document.querySelector('.container').createShadowRoot();
// 获取模板内容
var content = document.querySelector('template').content;
//将模板内容插入到shadowDOM中;
shadow.appendChild(content);
customElement
作用: customElement允许我们定制独有的HTMLElement元素;
生命周期:customElement在其生命周期内提供了四个回调函数createdCallback、attachedCallback、attributeChangedCallback和detachedCallback;
格式
//创建一个自定义DOM元素,继承自HTML.prototype;
var MyButton = Object.create(HTMLElement.prototype);
//增加自定义方法
MyButton.say = function(){
console.log('hello');
};
//增加生命周期方法
MyButton.createdCallback = function(){
this.innerHTML = 'hello,I\'m customElement!'
}
//将创建的DOM元素注册到DOM结构;这里的注册名字必须是带 '-'的写法;返回一个构造函数;
var myButton = document.registerElement('my-button',{
prototype:MyButton,
extends:'div',
//不加extends属性则为 <my-button></my-button>格式,加extends则为<div is="my-button"></div>格式
});
//接下来可以什么也不写,直接在页面中创建<div is="my-button"></div>;也可以执行下面的方法,自动添加;
var meButton =new myButton();
document.body.appendChild(meButton);
//获取加入的me-button
var s = document.querySelector('div[is="me-button"]');
s.say(); //output:hello;
总结
我理解的Web Components开发组件是customElement做外壳,在其中建立shadowDOM,将模板放到shadowDOM中,形成一个html页面,使用时通过HTML Import引入。
学习Web Components碰到最多问题是事件方面,很多问题都是由于真正的DOM结构里没有对应的元素,可以在元素被插入到DOM结构中再绑定事件,引以为戒!
在学习web Components的时候,想像着自己封装的一个个组件,将整个页面通过组件像"搭积木"一样搭起来,挺有意思!
web Components 学习之路的更多相关文章
- jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- Web前端 web的学习之路
零基础学习web前端的顺序 ( 转载自:https://blog.csdn.net/weixin_41780944/article/details/83751632) 怎么开始学习两条路:自学或者找培 ...
- Web前端 web的学习之路2
2019 年 Web 开发技术指南和趋势 2019/01/23 · JavaScript · 趋势 转载:原文出处: 李棠辉(http://web.jobbole.com/95622/) 以下内 ...
- web前端学习之路
test 随着自己对于web前端知识了解的越多,越来越发现自己真的好菜 一脸茫然阶段 两年前大学接触网页设计,那时对于网页设计一窍不通,只是看了一本自己大学编的一本入门教材,我甚至不知道那些网页设计的 ...
- Web开发学习之路--Springmvc+Hibernate之初体验
本来想继续学习android的,可是用到了android和服务器交互,需要实现个login的功能,苦于没有这么个环境,那就只能自己来搭建了.既然已经基本上可以玩web了,那么接下来使用web开源的框架 ...
- Web开发学习之路--Eclipse+Tomcat+mysql之初体验
学习了一段时间android,正好要用到android和服务器之间的交互,既然要学习android,那么就涉猎下服务器端的开发了,以前学过php,用thinkphp很快可以搭建起来,但是android ...
- web开发学习之路是否有尽头
Linux/Git/Pip/Npm/Composer Apache/Ngnix Mysql/MongoDb/Redis PHP/Python/NodeJS javascript/jQuery/Expr ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- *CTF——shellcode
一看题目是利用shellcode解决问题 伪代码: checksec:开启了NX exp: from pwn import* context(os='linux',arch='amd64',log ...
- pycharm的list中append的应用
li = [11,22,33,44] li.append(5) print(li) #输出结果 [11,22,33,44,5] #后面可加字母,列表等字符串
- ios6和ios5横竖屏切换
记录于2013/8/5 在切换横竖屏的时候调用到的一些委托方法: #pragma mark - UIApplicationDelegate //写在Appdelegate中,在具体的某一视图控制器 ...
- Python数据分析实战
Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...
- CentOS7 VMware-Tools安装与共享文件夹设置
一. VMware-Tools安装 1.加载VMware Tools的光驱:点击"虚拟机"->"安装VMware Tools".这里,由于我已经安装了,所 ...
- KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
在用富文本编辑器时经常会遇到的问题是asp.net报的”检测到有潜在危险的 Request.Form 值“一般的解法是在aspx页面 page 标签中加上 validaterequest='fa ...
- 《SpringMVC从入门到放肆》十一、SpringMVC注解式开发处理器方法返回值
上两篇我们对处理器方法的参数进行了分别讲解,今天来学习处理器方法的返回值. 一.返回ModelAndView 若处理器方法处理完后,需要跳转到其它资源,且又要在跳转资源之间传递数据,此时处理器方法返回 ...
- django介绍及路由系统
第一:Python的web框架介绍 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引 ...
- 4.23 Linux(3)
2019-4-23 19:03:53 买的服务器第三天感觉超爽!! 发现学习Linux超爽,有种操作的快感!!!!!是Windows比不了的!! 阿里巴巴镜像源 : https://opsx.alib ...
- laravel5单元测试
https://www.cnblogs.com/love-snow/articles/7641198.html