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

237
Visualizações
Cómo esperar a que appendChild() actualice y aplique estilo al DOM, antes de intentar medir el ancho del nuevo elemento

Estoy agregando un elemento DOM como este:

 this.store.state.runtime.UIWrap.appendChild(newElement)

Cuando trato de medir inmediatamente el ancho del nuevo elemento, obtengo 2 .

Lo intenté:

  • setTimeout()
  • ventana anidada window.requestAnimationFrame()
  • MutationObserver

Lo anterior funciona de manera muy poco confiable, como el 50% del tiempo. Solo cuando configuré un tiempo de espera grande como 500 ms, funcionó.

Esto sucede solo en el móvil.

Esta es la solución que estoy usando, pero es fea:

 function getWidthFromStyle(el) { return parseFloat(getComputedStyle(el, null).width.replace('px', '')) } function getWidthFromBoundingClientRect(el) { return el.getBoundingClientRect().width } console.log(getWidthFromBoundingClientRect(newElement)) while (getWidthFromBoundingClientRect(newElement) < 50) { await new Promise(r => setTimeout(r, 500)) console.log(getWidthFromBoundingClientRect(newElement)) }

Probé con ambas funciones getWidthFromStyle() y getWidthFromBoundingClientRect() - sin diferencia. El ancho se calcula correctamente después de un par de ciclos.

También intenté usar MutationObserver sin éxito.

¿Hay alguna manera de saber cuándo el DOM está completamente actualizado y diseñado antes de intentar medir el ancho/alto de un elemento?

PD: no estoy usando ningún marco. this.store.state.runtime... es mi propia implementación de una tienda, similar a Vue.

EDITAR: El tamaño del elemento dependía de una imagen dentro de él y estaba tratando de medir el elemento antes de que se cargara la imagen. Tonto.

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

0

Puedes usar algo como esto:

 export function waitElement(elementId) { return new Promise((resolve, reject) => { const element = document.getElementById(elementId); if (element) { resolve(element); } else { let tries = 10; const interval = setInterval(() => { const element = document.getElementById(elementId); if (element) { clearInterval(interval); resolve(element); } if (tries-- < 0) { clearInterval(interval); reject(new Error("Element not found")); } }, 100); } }); }
about 4 years ago · Juan Pablo Isaza Relatório

0

se puede hacer con MutationObserver .
¿Este método no resuelve tu problema?

 const div = document.querySelector("div"); const span = document.querySelector("span"); const observer = new MutationObserver(function () { console.log("new width", size()); }); observer.observe(div, { subtree: true, childList: true }); function addElem() { setTimeout(() => { const newSpan = document.createElement("span"); newSpan.innerHTML = "second"; div.appendChild(newSpan); console.log("element added"); }, 3000); } function size() { return div.getBoundingClientRect().width; } console.log("old width", size()); addElem();
 div { display: inline-block; border: 1px dashed; } span { background: gold; }
 <div> <span>one</span> </div>

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