¿Cómo llamar a una función después de que jQuery .append
esté completamente hecho?
He aquí un ejemplo:
$("#root").append(child, function(){
// Action after append is completly done
});
El problema: cuando se agrega una estructura DOM compleja, el cálculo del nuevo tamaño del elemento raíz dentro de la devolución de llamada de la función de agregar es incorrecto. Se supone que el DOM aún no está completamente cargado, solo el primer hijo del DOM complejo agregado lo está.
append()
toma muy poco tiempo.Respuestas:
Tiene muchas respuestas válidas aquí, pero ninguna de ellas realmente le dice por qué funciona como lo hace.
En JavaScript, los comandos se ejecutan uno a la vez, de forma sincrónica en el orden en que vienen, a menos que les indique explícitamente que sean asincrónicos mediante un tiempo de espera o un intervalo.
Esto significa que su
.append
método se ejecutará y nada más (sin tener en cuenta los posibles tiempos de espera o intervalos que puedan existir) se ejecutará hasta que ese método haya terminado su trabajo.Para resumir, no hay necesidad de una devolución de llamada, ya
.append
que se ejecutará de forma sincrónica.fuente
Bueno, tengo exactamente el mismo problema con el recálculo del tamaño y después de horas de dolor de cabeza tengo que no estar de acuerdo con
.append()
comportarme estrictamente sincrónico. Bueno, al menos en Google Chrome. Consulte el siguiente código.La propiedad padding-left se recupera correctamente en Firefox pero está vacía en Chrome. Como todas las demás propiedades de CSS, supongo. Después de algunos experimentos, tuve que conformarme con envolver el 'getter' de CSS
setTimeout()
con un retraso de 10 ms, que sé que es feo pero el único que funciona en Chrome. Si alguno de ustedes tuviera una idea de cómo resolver este problema de una mejor manera, estaría muy agradecido.fuente
.ready()
una solución mucho mejor y más elegante.Aunque Marcus Ekwall tiene toda la razón sobre la sincronicidad de append, también he descubierto que en situaciones extrañas a veces el navegador no representa completamente el DOM cuando se ejecuta la siguiente línea de código.
En este escenario, las soluciones de shadowdiver siguen las líneas correctas, con el uso de .ready, sin embargo, es mucho más ordenado encadenar la llamada a su anexo original.
fuente
Me sorprenden todas las respuestas aquí ...
Prueba esto:
Tenga en cuenta el tiempo de espera 0. No es un número arbitrario ... según tengo entendido (aunque mi comprensión puede ser un poco inestable), hay dos colas de eventos de JavaScript: una para macroeventos y otra para microeventos. La cola de alcance "más grande" contiene tareas que actualizan la IU (y DOM), mientras que la micro cola realiza operaciones de tipo de tarea rápida.
También tenga en cuenta que establecer un tiempo de espera no garantiza que el código funcione exactamente en ese valor especificado. Lo que hace esto es esencialmente poner la función en la cola superior (la que maneja la interfaz de usuario / DOM) y no la ejecuta antes del tiempo especificado.
Esto significa que establecer un tiempo de espera de 0 lo coloca en la parte de UI / DOM de la cola de eventos de JavaScript, para que se ejecute en la próxima oportunidad posible.
Esto significa que el DOM se actualiza con todos los elementos de la cola anteriores (como los insertados a través de
$.append(...);
, y cuando se ejecuta su código, el DOM está completamente disponible.(PD: aprendí esto de Secrects of the JavaScript Ninja , un excelente libro: https://www.manning.com/books/secrets-of-the-javascript-ninja )
fuente
setTimeout()
años agregando sin saber por qué. ¡Gracias por la explicación!Tengo otra variante que puede ser útil para alguien:
fuente
...on('load', function(){ ...
ver aquí: stackoverflow.com/a/37751413/2008111Me encontré con el mismo problema y encontré una solución simple. Agregue después de llamar a la función de agregar un documento listo.
fuente
El uso
MutationObserver
puede actuar como una devolución de llamada para elappend
método jQuery :Lo expliqué en otra pregunta , y esta vez solo daré un ejemplo para navegadores modernos:
fuente
Creo que esto está bien respondido, pero esto es un poco más específico para manejar el "subChild_with_SIZE" (si viene del padre, pero puede adaptarlo desde donde puede estar)
fuente
$.when($('#root').append(child)).then(anotherMethod());
fuente
$.when
solo funciona para aquellos objetos que devuelven un objeto de promesaanotherMethod()
inmediato ... No se pasa como una devolución de llamada.la función de adición de Jquery devuelve un objeto jQuery para que pueda etiquetar un método al final
fuente
Para imágenes y otras fuentes, puede usar eso:
fuente
La forma más limpia es hacerlo paso a paso. Utilice una función de each para recorrer cada elemento. Tan pronto como se agregue ese elemento, páselo a una función posterior para procesar ese elemento.
fuente
Encontré este problema al codificar HTML5 para dispositivos móviles. Algunas combinaciones de navegador / dispositivo causaron errores porque el método .append () no reflejó los cambios en el DOM de inmediato (lo que provocó que JS fallara).
La solución rápida y sucia para esta situación fue:
fuente
Sí, puede agregar una función de devolución de llamada a cualquier inserción DOM:
$myDiv.append( function(index_myDiv, HTML_myDiv){ //.... return child })
Consulte la documentación de JQuery: http://api.jquery.com/append/
Y aquí hay un ejemplo práctico similar: http://www.w3schools.com/jquery/ tryit.asp? filename = tryjquery_html_prepend_func
fuente
.prepend()
método con: $ ("p"). Prepend (function (n, pHTML) {return "<b> Este elemento p </b> (\" <i > "+ pHTML +" </i> \ ") <b> tiene índice" + n + "</b>.";Me encontré con un problema similar recientemente. La solución para mí fue volver a crear la colección. Déjame intentar demostrar:
¡Espero que esto ayude!
fuente
En jquery puede usar justo después de su adición
$ () llama a una función que registra una devolución de llamada lista para DOM (si se le pasa una función) o devuelve elementos del DOM (si se le pasa una cadena de selección o un elemento)
Puede encontrar más aquí la
diferencia entre $ y $ () en jQuery
http://api.jquery.com/ready/
fuente
Sé que no es la mejor solución, sino la mejor práctica:
fuente
Append no tiene devoluciones de llamada, y este es un código que se ejecuta sincrónicamente; no hay riesgo de que NO se realice
fuente
fuente