【发布时间】:2019-05-29 23:32:59
【问题描述】:
如何定义一个像<img> 一样工作的 Web 组件,因为它不接受子元素?
<script>
const QA = (q, d) => Array.prototype.slice.call((d||document).querySelectorAll(q), 0);
const QS = (q, d) => (d||document).querySelector(q);
</script>
<template id="push-message">
<style>
message { display: grid; font-family: sans-serif; background: #eee; outline: 1px solid; }
.badge { }
</style>
<message>
<img class="badge">
<img class="icon">
<img class="image">
</message>
</template>
<script>
const wpm = 'push-message';
customElements.define(wpm,
class extends HTMLElement {
constructor() {
super();
const l = QS(`#${wpm}`).content.cloneNode(true);
const s = this.attachShadow({ mode: 'open' }); s.appendChild(l);
}
QS(q) { return QS(q, this.shadowRoot); }
QA(q) { return QA(q, this.shadowRoot); }
static get observedAttributes() { return [ "badge", "icon", "image" ]; }
attributeChangedCallback(a, o, n) {
if (/^(badge|icon|image)$/.test(a))
this.QS(`.${a}`).src = n;
}
});
</script>
<push-message
badge="//google.com/favicon.ico"
icon="//google.com/favicon.ico"
image="//google.com/favicon.ico">
<p>ok</p>
DOM 应该是
<push-message></push-message>
<p></p>
不是
<push-message><p></p></push-message>
ok 应该会显示在结果中。
有没有办法更改 customElements.define 以避免必须显式关闭 <push-message></push-message> 并只使用 <push-message> 但隐式地自行关闭?
【问题讨论】:
-
虽然你现在不能这样做,但它肯定是一个不错的升级。而且,它不应该真的那么难实现。只需在调用
define时添加一个选项。
标签: html dom web-component