La risposta contrassegnata come corretta non ha funzionato per me e in realtà è sbagliata. È una specie di trucco e non dovrebbe essere considerato una risposta corretta. Allo stesso modo puoi eseguire il tuo codice all'interno di setTimeout (function() {..}, 1000). È ancora più affidabile in quanto è possibile impostare il ritardo: -/
Nel mio caso ho dovuto aspettare che tutti gli elementi siano elaborati per conoscere le loro dimensioni reali. Quando non sono costruiti, elaborati e completati, i numeri non sono corretti.
AGGIORNATO. Ecco la risposta corretta:
Molto probabilmente si ottengono i dati per la creazione di DOM utilizzando una chiamata asincrona come d3.json() ed è per questo che ci vuole del tempo. Poiché la chiamata asincrona è non bloccante, il codice successivo viene richiamato anche prima della fine della chiamata asincrona, causando problemi e questo è il motivo per cui hai postato questa domanda.
Quindi stai provando a risolvere questo cercando qualcosa in D3 o in qualsiasi altro luogo, questo ti dirà che la chiamata asincrona D3 è finita e ora puoi fare la tua prossima cosa. Alcune persone suggeriscono di effettuare una chiamata ajax di sincronizzazione. Questo è terribilmente sbagliato. Le chiamate asincrone sono create per essere asincrone.
Quello che devi fare è cambiare il tuo paradigma. Basta passare una richiamata a quella chiamata asincrona e il gioco è fatto!Qualcosa del genere:
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)
}
Inoltre, dare un'occhiata a async.js
eventi di legame come suggerito sopra è anche un'idea orribile. Dovresti invece usare .enter() .exit(). D3 è basato sui dati, se hai bisogno di flusso basato sugli eventi, quindi usa solo jQuery o vanilla JS!
Brillante, grazie. Chiaramente, sono stato in terra jQuery per troppo tempo. – Roshambo
Questa è una cattiva pratica, e perché ci sono così tante varianti già presenti in jQuery e nei suoi concorrenti. – ijw
ilw ha ragione. Su alcune WebViews su dispositivi mobili, quando si apre un'app viene segnalato a volte dimensioni della larghezza dello schermo errate. Aspettare il documento pronto lo evita. – phreakhead