P粉0943518782023-09-05 00:37:47
在开标签<editable-h1>
上触发connectedCallback
事件
所以你的Hello World
的innerHTML还没有被解析
要等到解析完成后再执行,使用setTimeout
注意:所有提供parsedCallback
的工具和库都会在底层使用类似的技巧,使用requestAnimationFrame
或MutationObserver
(还有更多代码行)。
如果你认为一行setTimeout
是一个hack,或者你不想使用setTimeout
浪费那一毫秒,可以查看Andrea Giammarchi的html-parsed-element代码
(当然需要加载和解析,还会增加依赖和代码复杂性,所以总体需要更多时间)
并且关注WC专家,这个讨论还在继续:
需要一个回调函数来在子元素改变或解析完成后执行
https://github.com/WICG/webcomponents/issues/809
所有方法归结为同一个目标:等待事件循环为空
什么是事件循环?https://www.youtube.com/watch?v=8aGhZQkoFbQ
customElements.define("editable-h1", class extends HTMLElement { connectedCallback() { setTimeout(() => { this.innerHTML = `<h1>${this.innerHTML}</h1><button>Edit</button>`; let h1 = this.querySelector("h1"); let button = this.querySelector("button"); button.onclick = (evt) => { button.innerHTML = (h1.contentEditable = !h1.isContentEditable) ? (h1.focus(),"Save") : "Edit"; } }); } });
<editable-h1>Hello World!</editable-h1> <editable-h1>Hello Web Components World!</editable-h1>