Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

111
Visualizações
Componentes web y funciones JS

Estoy trabajando en un componente web y tengo problemas para conectar la función JS que aleatoriza los colores. Lo que he logrado hasta ahora son diferentes estilos para el elemento DOM global y DOM sombra <h3> (oración 1 y oración 2 respectivamente). Lo que necesito es el elemento shadow DOM <h3> para aplicar colores aleatorios de la matriz que se encuentra en la función changeColor(). ¿Alguna idea sobre cómo puedo incorporar la función en el shadow DOM?

 const template = document.createElement('template'); template.innerHTML = ` <style> h3 { color: coral; } </style> <h3>Sentence 2 </h3> `; class UserCard extends HTMLElement { constructor() { super(); this.attachShadow({mode: 'open'}); this.shadowRoot.appendChild(template.content.cloneNode(true)); } }; window.customElements.define('user-card', UserCard); function changeColor() { let num = 0; let arr = ['#FFD640;', '#fdff76', '#f0cd59', '#fa9624', '#fa6824', '#a33f11']; window.setInterval(function () { num = (num + 1) % 4; document.querySelector('h3').style.color = arr[Math.floor(Math.random() * arr.length)]; }, 1000); }
 <!DOCTYPE html> <html lang = "en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web Components Example</title> </head> <body> <h3>Sentence 1</h3> <user-card> <script src="userCard.js"></script> </user-card> </body> </html>

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Yo lo acortaría a:

 customElements.define('user-card', class extends HTMLElement { constructor() { super().attachShadow({mode:"open"}) .innerHTML = "<style>h3{color:coral}</style><h3>Sentence 2 </h3>"; let arr = ['#FFD640;', '#fdff76', '#f0cd59', '#fa9624', '#fa6824', '#a33f11']; setInterval(() => { let newColor = arr[Math.floor(Math.random() * arr.length)]; this.shadowRoot.querySelector('h3').style.color = newColor; }, 100); } });
 <user-card></user-card>

  • La definición de class separada solo se requiere cuando necesita usarla varias veces
  • super conjuntos Y devuelve el alcance 'esto', para que pueda encadenarlo
  • attachShadow establece Y devuelve this.shadowRoot , para que pueda encadenarlo
  • <templates> solo tiene sentido para HTML más complejo, use .innerHTML para las cosas fáciles
  • Está almacenando la referencia de ID de setInterval en this.changeColor (requerido si desea finalizar el ciclo) Pero luego lo está llamando como una función... vea: https://developer.mozilla.org/en-US/ docs/Web/API/setInterval
about 4 years ago · Juan Pablo Isaza Relatório

0

Otra opción sería pasar el context para querySelector a changeColor , con document como predeterminado si no se pasa ningún contexto. De esta manera, changeColor se vuelve más flexible y al mismo tiempo conserva la compatibilidad con versiones anteriores.

 const template = document.createElement('template'); template.innerHTML = ` <style> h3 { color: coral; } </style> <h3>Sentence 2 </h3> `; class UserCard extends HTMLElement { constructor() { super(); this.attachShadow({mode: 'open'}); this.shadowRoot.appendChild(template.content.cloneNode(true)); changeColor(this.shadowRoot); } }; window.customElements.define('user-card', UserCard); function changeColor(context = document) { let num = 0; let arr = ['#FFD640;', '#fdff76', '#f0cd59', '#fa9624', '#fa6824', '#a33f11']; window.setInterval(function () { num = (num + 1) % 4; context.querySelector('h3').style.color = arr[Math.floor(Math.random() * arr.length)]; }, 1000); }
 <!DOCTYPE html> <html lang = "en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web Components Example</title> </head> <body> <h3>Sentence 1</h3> <user-card> <script src="userCard.js"></script> </user-card> </body> </html>

about 4 years ago · Juan Pablo Isaza Relatório

0

Defina los colores en la clase como una propiedad. Cree una función o un captador para recuperar el elemento h3 de Shadow DOM para facilitar el acceso.

Los elementos personalizados tienen ciclos de vida, lo que significa que tiene ciertos métodos que se llamarán en ciertos momentos según el contexto. Se llamará a connectedCallback cuando el elemento se coloque dentro del DOM principal y se asegurará de que su componente esté renderizado y listo. Allí llame a su lógica setInterval . Cambie la declaración de function() a una función de flecha () => para asegurarse de que this palabra clave apunte al componente.

 const template = document.createElement('template'); template.innerHTML = ` <style> h3 { color: coral; } </style> <h3>Sentence 2</h3> `; class UserCard extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); this.shadowRoot.appendChild(template.content.cloneNode(true)); } colors = ['#FFD640', '#fdff76', '#f0cd59', '#fa9624', '#fa6824', '#a33f11']; get heading() { return this.shadowRoot.querySelector('h3'); } connectedCallback() { window.setInterval(() => { this.heading.style.color = this.colors[Math.floor(Math.random() * this.colors.length)]; }, 1000); } }; window.customElements.define('user-card', UserCard);
 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web Components Example</title> </head> <body> <h3>Sentence 1</h3> <user-card></user-card> <script src="userCard.js"></script> </body> </html>

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda