La respuesta marcada como correcta no funcionó, y en realidad es incorrecta. Es una especie de truco y no debe considerarse una respuesta correcta. De la misma forma en que podría ejecutar su código dentro de setTimeout (function() {..}, 1000). Es aún más confiable ya que puede configurar la demora: -/
En mi caso, tuve que esperar a que se procesaran todos los elementos para conocer sus dimensiones reales. Cuando no están construidos, procesados y hechos, los números no eran correctos.
ACTUALIZADO. Aquí está la respuesta correcta:
Lo más probable es que obtenga sus datos para construir DOM utilizando alguna llamada asincrónica como d3.json() y es por eso que lleva algún tiempo. Como la llamada asincrónica no es bloqueante, su código subsiguiente se invoca incluso antes de que finalice la llamada asincrónica, lo que causa problemas, y esta es la razón por la que ha enviado esta pregunta.
Así que está tratando de resolver esto buscando algo en D3 o en cualquier otro lugar, eso le indicará que la llamada asincrónica D3 ha finalizado y que ahora puede hacer lo siguiente. Algunas personas sugieren hacer una llamada ajax de sincronización. Esto es terriblemente INCORRECTO Las llamadas asincrónicas se crean para ser asincrónicas.
Lo que realmente necesita hacer es cambiar su paradigma. ¡Simplemente pase una devolución de llamada a esa llamada asíncrona y listo!Algo así:
function thingsToDoWhenDOMisBuilt() {
...
}
function buildDOM(rootNode, error, thingsToDoWhenDOMisBuilt) {
...
// everything is built, so we can do our post-build thing against DOM
if (thingsToDoWhenDOMisBuilt)
thingsToDoWhenDOMisBuilt()
}
d3.json(urlToData, buildDOM) {
if (error)
console.log("oops")
buildDOM(rootNode, thingsToDoWhenDOMisBuilt)
}
También, echar un vistazo a async.js
sucesos de unión como se sugirió anteriormente es también una idea horrible. Debería usar .enter() .exit() en su lugar. D3 es impulsado por datos, si necesita flujo controlado por eventos, entonces simplemente use jQuery o JS vainilla.
Brillante, gracias. Claramente, he estado en una tierra jQuery demasiado tiempo. – Roshambo
Esta es una mala práctica, y por qué hay tantas variantes en curso en jQuery y sus competidores. – ijw
ilw tiene razón. En ciertos WebViews móviles, a veces informará los tamaños de ancho de pantalla incorrectos al abrir una aplicación. Esperando el documento en listo evita eso. – phreakhead