You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<info-template></info-template><templateid="info-template"><style>
p {color: red;}</style><p>hellotemplate</p></template><script>
class infoTemplate extends HTMLElement {constructor(){super()letshadowRoot=this.attachShadow({mode: 'open'})constt=document.querySelector('#info-template')constinstance=t.content.cloneNode(true)shadowRoot.appendChild(instance)}}customElements.define('info-template',infoTemplate)
HTML 使用起来非常宽松和灵活。例如,在页面上声明 randomtagthatdoesntexist,浏览器将非常乐意接受它。为什么非标准标记可以生效?答案在于 HTML 规范允许这样。规范没有定义的元素作为 HTMLUnknownElement 进行解析。
自定义元素则并非如此。如果在创建时使用有效的名称(包含“-”),则潜在的自定义元素将解析为 HTMLElement。 您可以在支持自定义元素的浏览器中核实这一点。打开控制台:Ctrl+Shift+J(或者在 Mac 上,Cmd+Opt+J)并粘贴下列代码行:
// "tabs" is not a valid custom element namedocument.createElement('tabs')instanceofHTMLUnknownElement===true// "x-tabs" is a valid custom element namedocument.createElement('x-tabs')instanceofHTMLElement===true
2019-09-15 01:42:32
首先来写一个示例吧
Web Components 标准非常重要的一个特性是,它使开发者能够将HTML页面的功能封装为 custom elements(自定义标签),而往常,开发者不得不写一大堆冗长、深层嵌套的标签来实现同样的页面功能。这篇文章将会介绍如何使用HTML的custom elements。 - MDN
https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_custom_elements
具体看MDN文档,(复制完应该就差不多了 然后去这里玩)
https://developers.google.com/web/fundamentals/web-components/
查看demo
定义新元素
扩展元素
扩展自定义元素
customElements 全局性用于定义自定义元素
customElements.define(),并使用 JavaScript class 扩展基础 HTMLElement
继承自定义元素好像效果有点不对(我还没找到为啥 希望大佬教教我)
有关创建自定义元素的规则
和上面很相识, 扩展了自定义的元素
扩展原生 HTML 元素
要扩展元素,您需要创建继承自正确 DOM 接口的类定义
扩展原生元素时,对 define() 的调用会稍有不同。所需的第三个参数告知浏览器要扩展的标记。
这很有必要,因为许多 HTML 标记均使用同一 DOM 接口
例如 section address 和 em(以及其他)都使用 HTMLElement;q 和 blockquote 则使用 HTMLQuoteElement;等等。
指定 {extends: 'blockquote'} 可让浏览器知道您创建的是 blockquote 而不是 q。有关 HTML DOM 接口的完整列表,请参阅 HTML 规范。
自定义元素响应
自定义元素可以定义特殊生命周期钩子
https://developers.google.com/web/fundamentals/web-components/customelements#extendhtml
https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_custom_elements#%E4%BD%BF%E7%94%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0
dom创建时候 创建内容
dom 移除执行的方法 可以移除事件什么的
需要注意的是,如果需要在元素属性变化后,触发 attributeChangedCallback()回调函数,你必须监听这个属性。这可以通过定义observedAttributes() get函数来实现,observedAttributes()函数体内包含一个 return语句,返回一个数组,包含了需要监听的属性名称:
监听属性变化 调用的方法 比如 role="popup" 什么的
自定义元素被移入新的 document
元素定义的内容
以新内容覆盖元素的子项并非一种好的做法,因为这样做会不符合设想。
添加元素定义内容的更好做法是使用 shadow DOM,下一篇文章会写
通过 template 创建元素
设置自定义元素样式
:defined CSS 伪类 表示任何已定义的元素。这包括任何浏览器内置的标准元素以及已成功定义的自定义元素 (例如通过 CustomElementRegistry.define() 方法)。
https://developer.mozilla.org/zh-CN/docs/Web/CSS/:defined
定义之前会隐藏起来哦
其他详情
未知元素与未定义的自定义元素
HTML 使用起来非常宽松和灵活。例如,在页面上声明 randomtagthatdoesntexist,浏览器将非常乐意接受它。为什么非标准标记可以生效?答案在于 HTML 规范允许这样。规范没有定义的元素作为 HTMLUnknownElement 进行解析。
自定义元素则并非如此。如果在创建时使用有效的名称(包含“-”),则潜在的自定义元素将解析为 HTMLElement。 您可以在支持自定义元素的浏览器中核实这一点。打开控制台:Ctrl+Shift+J(或者在 Mac 上,Cmd+Opt+J)并粘贴下列代码行:
API 参考
全局性 customElements 定义了处理自定义元素的方法。
define(tagName, constructor, options)
在浏览器中定义新的自定义元素。
抽离出来可以更利于阅读
get(tagName)
在给定有效自定义元素标记名称的情况下,返回元素的构造函数。
如果没有注册元素定义,则返回 undefined。
whenDefined(tagName)
如果定义了自定义元素,则返回可解析的 Promise。如果元素已定义,则立即得到解析。
如果标记名称并非有效自定义元素名称,则拒绝(好像也不会走catch)
历史记录和浏览器支持
如果您最近几年持续关注网络组件,您应知道 Chrome 36+ 实施的自定义元素 API 版本使用了 document.registerElement() 而不是 customElements.define()。
但前者是标准的弃用版本,称为 v0。customElements.define() 成为现行标准并逐步获得各大浏览器厂商的支持。这称为自定义元素 v1。
https://developers.google.com/web/fundamentals/web-components/customelements
浏览器支持
要检测自定义元素功能,检测是否存在 window.customElements:
Polyfill
https://www.npmjs.com/package/@webcomponents/custom-elements
注:无法对 :defined CSS 伪类执行 polyfill。 (没测试过)
总结:
自定义元素提供了一种新工具,可让我们在浏览器中定义新 HTML 标记并创建可重用的组件。
它们与 Shadow DOM 和 template 等新平台原语结合使用,我们可开始实现更多的可能
https://developers.google.com/web/fundamentals/web-components/customelements
https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_custom_elements
The text was updated successfully, but these errors were encountered: