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>