На самом деле вы можете определить пользовательский элемент перед его добавлением в DOM.
Что вы не можете сделать, так это получить доступ к его содержимому (атрибутам, дочернему дереву, свойствам) в его constructor()
, потому что эти элементы не были проанализированы (как предложил @Patrick Evans).
В вашем примере вы могли бы немного подождать, чтобы получить доступ к свойству textContent
.
constructor() {
super()
setTimeout( () => console.log(this.textContent) )
}
Если вы все еще хотите поместить определение пользовательских элементов в заголовок, вы можете дождаться загрузки страницы.
window.onload => customElements.define(...)
или, в зависимости от того, что вы ждете:
document.addEventListener( 'DOMContentLoaded', customElements.define(...) )
Это не черно-белое изображение в спецификациях, потому что это скорее следствие процесса разбора, но вы можете прочитать в этом разделе HTML Standard :
Атрибуты и дочерние элементы не должны проверяться, , поскольку в случае отсутствия обновления ни один не будет присутствовать , а использование обновлений делает элемент менее пригодным для использования.
«Случай отсутствия обновления» - это когда элемент определен до его анализа.