Я создал простой компонент без shadowDOM. Я написал следующий код в конструкторе:
this.addEventListener('readystatechange', (evt) => {console.log('readystatechange', evt)});
this.addEventListener('load', (evt) => {console.log('load', evt)});
this.addEventListener('progress', (evt) => {console.log('progress', evt)});
this.addEventListener('DOMContentLoaded', (evt) => {console.log('DOMContentLoaded', evt)});
И не получил выхода. Таким образом, ни одно из этих событий не запускается в веб-компоненте.
Затем я добавил этот код вне компонента:
function callback(mutationsList, observer) {
for(var mutation of mutationsList) {
if (mutation.type === 'childList') {
if (mutation.removedNodes.length) {
console.log(`${mutation.removedNodes.length} child node(s) have been removed.`);
}
if (mutation.addedNodes.length) {
console.log(`${mutation.addedNodes.length} child node(s) have been added.`);
}
}
}
}
var config = { childList: true };
var observer = new MutationObserver(callback);
И эта строка для конструктора:
observer.observe(this, config);
На моем конкретном компоненте мой callback
никогда не вызывался.
У меня был другой компонент, который меняет своих потомков, и был вызван обратный вызов.
Итак, я не вижу ни одного события или даже наблюдателя мутации, который срабатывает, когда компонент полностью загружен.
Лично я бы использовал setTimeout
, как вы, поскольку это, кажется, единственный надежный способ получить вызов, когда компонент сделан. Хотя вам может потребоваться указать, куда именно вы положили setTimeout
, чтобы убедиться, что вы полностью отрисовали DOM.