Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

113
Vistas
Componente web Javascript: this.shadowRoot.querySelector() siempre devuelve nulo

Estoy haciendo un componente web con JavaScript vainilla de la siguiente manera:

 <template id="TEMPLATE_UPLOADER"> <div>Try Query Me</div> </template> <script> customElements.define('my-uploader', class extends HTMLElement { constructor() { const template = document.getElementById("TEMPLATE_UPLOADER"); const content = template.content; let superThis = super() // Create and binds the this keyword let shadowRoot = superThis.attachShadow({mode: "open"}); shadowRoot.appendChild(template.cloneNode(content, true)); } /** Custom Component Reactions **/ connectedCallback() { setTimeout(this.init.bind(this), 1000) } init() { const el = this.shadowRoot.querySelector('div'); console.log('I hope el is not null:', el) } }); </script> <my-uploader></my-uploader>

Ahora dentro de init() deseo consultar algunos de los elementos dentro de la plantilla para este componente. Sin embargo this.shadowRoot.querySelector siempre devuelve null . Señalé que los elementos aún no se crearon en el momento de la devolución de llamada connectedCallback , por lo que configuré un tiempo de espera para llamar a init() después de 1 segundo para asegurarme de que se terminó de crear, pero obtuve el mismo resultado. Así es como se ve this.shadowRoot en Chrome (nota al margen this es <my-uploader></my-uploader> ):

ingrese la descripción de la imagen aquí

Como puede ver, hay divs dentro, sin embargo, this.shadowRoot.querySelector('div') devuelve nulo. ¿Cómo consultar elementos dentro del componente web?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

template.cloneNode(content, true)

Debería ser: template.cloneNode(true)

Su content es una referencia DOM interpretada como FALSA, por lo que creó una copia SUPERFICIAL, sin el <div>

Condensé un poco tu código.

 <template id="TEMPLATE_UPLOADER"> <div>Try Query Me</div> </template> <script> customElements.define('my-uploader', class extends HTMLElement { constructor() { const template = document.getElementById("TEMPLATE_UPLOADER").content; super() .attachShadow({mode: "open"}) .append(template.cloneNode(true)); } connectedCallback() { setTimeout( () => this.init() ); // don't learn JRs that oldskool bind stuff } init() { const el = this.shadowRoot.querySelector('div'); console.log('I hope el is not null:', el) } }); </script> <my-uploader></my-uploader>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda