自定义组件WebComponents加HTML模板template元素及shadowDOM影子DOM及定义一些事件
自定义组件WebComponents加HTML模板template元素及shadowDOM影子DOM及定义一些事件
Web Components
自定义组件,可以自定义一个类似于div的元素,里面的事件可以自定义。template元素
HTML模板,可以把一堆的DOM元素放到一起。shadow DOM
影子DOM,可以在一个元素内放置独属于自己的元素,可配合slot标签做插槽。shadowRoot
相当于一个阉割的document
,但它只有独立的css作用域
而没有独立的js作用域
。
加了一些事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>WebComponents浏览器原生组件</title>
</head>
<body>
<template id="outTemplate">
<div>位于自定义组外的HTML无主模版1</div>
<div>div2</div>
</template>
<my-web-component fang="test">
自定义组件默认插槽内容
<template> 默认插槽内容 </template>
<template id="innerTemplate">
<p>位于自定义组件中的HTML无主模版2</p>
<div>div2</div>
</template>
<template slot="name2-slot">
<span>name2-slot插槽内容</span>
</template>
<h3 slot="name1-slot">name1-slot插槽内容</h3>
</my-web-component>
<div>原生div元素</div>
<span>原生span元素</span>
</body>
<script>
//初始化自定义组件的值。
class MyWebComponent extends HTMLElement {
constructor() {
super();
this.组件自定义变量 = "初始值";
console.log("在自定义组件整个生命周期中只会被触发一次。", this);
this.num = 0;
//监听事件,并修改自定义事件。实际上可以创建生命周期函数。
this.addEventListener("click", () => {
this.num++;
console.log(this.num);
});
this.自定义组件私有方法 = (event) => {
console.log("自定义组件私有方法", event);
};
//设置影子DOM
const js写的HTML模板 = document.createDocumentFragment(); //手动创建一个template元素。
js写的HTML模板.appendChild(document.createElement("div"));
js写的HTML模板.querySelector("div").innerHTML = `
<p>p1</p>
<p>自定义组件中用js写的自定义HTML模板中插入的p元素中文本</p>
`;
console.log("js写的HTML模板-->", js写的HTML模板);
const 影子DOM根节点open型 = this.attachShadow({ mode: "open" }); //获取open型的当前组件的影子DOM根节点。
影子DOM根节点open型.innerHTML = `
<h1 οnclick="console.log('点击了影子DOM中的标题',[this],[event.target],[event])">影子DOM中的标题</h1>
<p οnclick="event.target.getRootNode().host.自定义组件私有方法(event)">直接在dom中调用自定义组件私有方法-影子DOM中的p元素</p>
<div class="slot">
<span>默认插槽1</span>
<slot>默认插槽slot空的默认值</slot>
</div>
<div class="name1-slot">
<span>具名插槽1</span>
<slot name="name1-slot">具名插槽slot name="name1-slot"的默认值</slot>
</div>
<div class="default-slot">
<span>默认插槽2</span>
<slot name="default">默认插槽slot name="default"的默认值</slot>
</div>
<div class="name2-slot">
<span>具名插槽2</span>
<slot name="name2-slot">具名插槽slot name="name2-slot"的默认值</slot>
</div>
<div οnclick="自定义组件私有方法(event.target,'点击了影子DOM中的div元素1')">影子DOM中的div元素1</div>
<div class="last-div">影子DOM中的div元素2</div>
<style>
div{border: 1px solid rgb(255,255,0);}
p{font-size:20px;font-weight:100;}
.slot{color:red}
.default-slot{color:green}
.name1-slot{color:blue}
.name2-slot{color:pink}
.last-div{cursor:pointer}
</style>
<script>
//不执行这些代码
var 影子DOM内自定义方法 = (event,说明=''){
console.log(说明, event)
}
影子DOM内自定义方法('影子DOM内自定义方法')
<\/script>
`;
this.shadowRoot.appendChild(js写的HTML模板); //设置了this.attachShadow()后this.shadowRoot才有值。
const 影子DOM事件方法 = (event) => {
console.log("自定义组件专属函数", event);
};
this.shadowRoot
.querySelector(".last-div")
.addEventListener("click", 影子DOM事件方法);
console.log("影子DOM根节点open型-->", 影子DOM根节点open型);
}
自定义组件上的自定义方法(event, 说明 = "") {
console.log(说明, event);
}
connectedCallback(event) {
console.log("组件被加到DOM上或在节点树中移动时触发。", event);
}
disconnectedCallback(event) {
console.log("当组件被从DOM上移除时触发。", event);
}
adoptedCallback(event) {
console.log("组件被document.adoptNode()移动到新文档时触发", event);
}
attributeChangedCallback(name, oldValue, newValue) {
console.log("当组件的attribute改变时触发", name, oldValue, newValue);
}
observedAttributes(value) {
console.log("observedAttributes(),在这里返回自定义元素的属性", value);
console.log("this.组件自定义变量--->", this.组件自定义变量);
return ["fang"];
}
get fang() {
console.log(value, "get fang()", this.组件自定义变量);
this.getAttribute("fang") || "";
}
set fang(value) {
console.log(value, "get fang()", this.组件自定义变量);
this.组件自定义变量 = "初始值" + value;
this.setAttribute("fang", value);
}
}
//注册自定义组件;
window.customElements.define("my-web-component", MyWebComponent);
</script>
</html>
参考
- Web组件API – 自定义组件要看
- 原生js也可以自定义组件
- 深入理解Web Components
- Web Components-MDN文档
- HTML Imports - 在当前文档中导入html文档并使用其中的一部分
- 利用废弃的html rel import实现页面include功能 - 就是用自定义组件来实现
- HTMLUnknownElement与HTML5自定义元素的故事 - 自定义组件的来源
- HTMLUnknownElement - 无效的HTML元素 - MDN文档
- 影子DOM v1: 自足的Web组件 - 关于一个web组件的详细讲解
<slot>
- MDN文档- 把富文本封装在 shadow DOM 中,要注意些啥? - shadowRoot 相当于一个阉割的 document,但它只有独立的 css 作用域而没有独立的 js 作用域
- 使用 shadow DOM - MDN
- html通过模板字符串写入script标签
- 原生js绑定事件的方法和dom操作
- shadow DOM的介绍和使用
- 影子节点ShadowDOM – 自定义组件要看
自定义组件WebComponents加HTML模板template元素及shadowDOM影子DOM及定义一些事件的更多相关文章
- 自定义元素–为你的HTML代码定义新元素
注意:这篇文章介绍的 API 尚未完全标准化,并且仍在变动中,在项目中使用这些实验性 API 时请务必谨慎. 引言 现在的 web 严重缺乏表达能力.你只要瞧一眼“现代”的 web 应用,比如 GMa ...
- Vue 组件6内联模板
如果子组件有inline-template特性,组件将把它的内容当做模板,而不是把它当做分发内容,这样模板更灵活. <my-component inline-template> <d ...
- 设置tabBar、使用第三方插件和自定义组件使用简单实例
创建小程序项目进入时填写,因需要用上第三方插件,所以要填上开发者的APPID,前往微信公众平台去注册一个账号获取APPID,在设置=>开发设置可以查看相关appid信息 简单思路 底部导航添加三 ...
- axure复用-自定义组件,母版(模板)
组件(控件)是用于设计线框图的用户界面元素.在组件(控件)面板中包含有常用的控件库,如按钮.图片.文本框等.从组件面板中拖动一个控件到线框图区域中,就可以添加一个组件.组件可以从一个线框图中被拷贝(C ...
- Vue 组件&组件之间的通信 之 template模板引用与动态组件的使用
template模板引用 在component的template中书写大量的HTML元素很麻烦. Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的t ...
- 在Vue.js2.0中组件模板子元素数量问题
在Vue中当利用组件进行开发时候,组件所使用的模板只可以应用于一个根实例,当你需要添加多个子元素的时候,可以用一个div将它们包裹起来,代码如下: <template id="task ...
- 微信小程序开发--模板(template)使用,数据加载,点击交互
微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...
- iview table里面 插入下拉列表组件(自定义组件)一定要加key,不加key,table开始会加载所有数据,然后再从第2页点回第一页,就会走onChange事件,混乱的逻辑,切记加:key
iview table里面 插入下拉列表组件(自定义组件)一定要加key,不加key,table开始会加载所有数据,然后再从第2页点回第一页,就会走onChange事件,混乱的逻辑,切记加:key 关 ...
- angular4自定义组件非input元素实现ngModel双向数据绑定
在angular里我们一般都是给input元素添加[(ngModel)]="value"实现数据双向绑定,如果想实现自定义的组件上实现ngModel双向数据绑定应该怎么办呐... ...
- vue 上拉加载自定义组件,超好用哦
1.创建组件components > zj-roll > index.vue <template> <div> <slot></slot> ...
随机推荐
- [转帖]《Linux性能优化实战》笔记(一)—— 平均负载
最近在看极客时间的<Linux性能优化实战>课程,记录下学习内容. 一. 平均负载(Load Average) 1. 概念 我们都知道uptime命令的最后三列分别是过去 1 分钟.5 分 ...
- [转帖]Steam内存测试工具【转】
转自:https://www.cnblogs.com/iouwenbo/p/14377478.html Stream测试是内存测试中业界公认的内存带宽性能测试基准工具. Stream安装 官方源码 ...
- [转帖]Docker限制容器的资源
docker在默认运行容器的情况下,是不会对运行的容器进行资源限制的,在自己的实验环境的话是随便你怎么弄的,不过在生产中是一定会对docker运行的容器进行资源限制的,如果不限制的话在生产中会带来 ...
- [转帖]linux学习:sed与awk与tr用法整理
https://www.cnblogs.com/LO-gin/p/6882490.html 流编辑器:sed 语法:sed [-hnV][-e<script>][-f<script文 ...
- JVM 堆外内存查看方法
JVM 堆外内存查看方法 JVM 堆外内存查看方法 1.概述 是否曾经想过为什么Java应用程序通过众所周知的*-Xms和-Xmx调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JV ...
- 介绍一个golang库:zstd
zstd是facebook开源的一个C语言的压缩库. 从官方提供的压测数据看,它的压缩速度与众所周知的以快著称的snappy的压缩速度几乎持平,但是压缩率上比老牌的gzip还要高. 再看看zstd吊打 ...
- JS ----- JS原型与原型链终极详解(一)
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...
- Java中的基本数据类型和包装类型的这些知识,你都知道吗?
Java中的基本数据类型和包装类型 Java 中的基本数据按类型可以分为四大类:布尔型.整数型.浮点型.字符型: 这四大类包含 8 种基本数据类型. 布尔型:boolean 整数型:byte.shor ...
- Leetcode 面试题22. 链表中倒数第k个节点 Java语言求解
题目链接 https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 题目内容 输入一个链表,输出该链 ...
- TienChin 活动管理-活动列表展示
后端 ActivityVO /** * @author BNTang * @version 1.0 * @description 活动管理VO * @since 2023-23-05 **/ publ ...