di recente ho trovato la seguente domanda on-line:Come scrivere una funzione che aggiunge un elemento al DOM e ritarda il prossimo segno di spunta?
scrivere una funzione che prende un oggetto e lo aggiunge al DOM, rendendo in modo che gli eventi vengono memorizzati nel buffer fino a quando il segno di spunta accanto? Spiegare perché questo è utile?
Ecco la mia risposta:
function appendElement(element) {
setTimeout(function() {
document.body.appendChild(element);
}, 0);
}
Perché ho impostare l'intervallo a zero?
Secondo this article, impostare il timeout a 0, ritarda gli eventi fino al prossimo segno di spunta:
L'esecuzione di func va alla coda di eventi sul timer tick più vicino. Nota, non è immediatamente. Nessuna azione viene eseguita fino al prossimo segno di spunta.
Ecco quello che sono incerto:
- è la mia soluzione giusta?
- Non posso rispondere perché questo approccio è vantaggioso
Per avere un riferimento, ho ricevuto questa domanda da questo sito listing 8 JavaScript interview questions.
Vorrei anche precisare che sto facendo questa domanda per la mia ricerca e miglioramento e non come parte di una sfida di codice, domanda di intervista o compito a casa.
Ciò consentirà di vedere ogni elemento aggiunto, uno alla volta (molto rapidamente ovviamente). Se lo metti in loop, il browser attenderà fino al termine prima di ridisegnare lo schermo. Questo è un esempio di sincronicità. – Ian
Solo per chiarimenti, stai parlando della funzione chiamata all'interno di un ciclo, sì? Inoltre, un simile approccio causerebbe ripetizioni multiple, corretto? –
Mi dispiace, non so perché ho pensato che questo codice venisse chiamato in un loop. Ho riletto solo ora. Credo che il mio punto fosse che se la tua funzione veniva chiamata in un ciclo (diciamo da 0 a 9), potresti/potresti vedere ogni elemento aggiunto, perché c'è un ridisegno poiché sono asincroni. Se non hai usato 'setTimeout' e hai appena chiamato' .appendChild' nello stesso ciclo 'for', li vedresti tutti visualizzati contemporaneamente, perché il codice è sincrono e alla fine verrà visualizzato solo un repaint. Non sono sicuro che tutto sia ancora più collegato :) – Ian