2011-02-22 12 views
17

He visto una serie de mensajes (append supposedly immediate) con respuestas aceptadas conflictivas sobre esto. Estamos usando jQuery 1.4 (http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js) y añadir() parece ser asíncrono, de tal manera que:¿Jquery append() se comporta de forma asíncrona?

Editado para mostrar el código en el contexto de devolución de llamada AJAX

... 
var message = $.ajax({ 
    type: "GET", 
    url: "/getVolumes/" + _Id, 
    async: false 
}).responseText; 
if (parseInt(message) != 0){ 
    var $results = $(message); 
    $MAIN_DIV.append($results); 
    retrieveTargets(); 
} 
...  
function retrieveTargets(){ 
    var $targets = $(".resultTargets"); 
} 

ejecuta y crea la página como se esperaba, pero la consulta de objetivos no produce nada en el tiempo de ejecución. Al ejecutar el mismo código en la consola JS, se recuperan los elementos como se esperaba.

Si este es el comportamiento esperado en JQuery, ¿cuál es la forma correcta de esperar hasta que termine append?

+2

jQuery 1.8 ?? ¿¿Cómo?? Eres del futuro? :) – DrStrangeLove

+2

Añadir es sincrónico pero tu llamada Ajax no lo es. ¿Dónde está ubicado este código? En la función de devolución de llamada de su llamada ajax? – Capsule

+0

Editado con la versión correcta. Apuesto a que esto funcionaría de la manera que quiero en 1.8. – RSG

Respuesta

24

Todos los comentarios ayudaron a rastrear esto. Estaba siguiendo una pista falsa en la consola. El problema no era con la sincronicidad, fue con las siguientes líneas:

$targets.each(function(){ 
    ... 
    this.html(); 
    ... 

necesitaba ser

$(this).html(); 

En resumen, todo el mundo era correcta. Jquery append() se comporta de forma síncrona.

8

Pruebe esto, si las cosas no funcionan después de append.

$('#dynamic-container').append(<your-content>) ; 
setTimeout(function() { 
    ...code which addresses elements inside #dynamic-container... 
},0) ; 

Más detalles:

  • Al parecer append es sincrónico
  • Al parecer el DOM no se actualiza de forma sincrónica, especialmente en Google Chrome, me enfrenté a este problema al intentar recuperar la altura de un div después de append
  • Mi hipótesis era que había subprocesos de actualización del navegador que se actualizaban de forma asíncrona, más comentarios sobre eso a continuación, aún no está claro cómo funcionaban las cosas w ork, pero la solución funciona en todos los casos para mí.
+1

Esto es incorrecto. El navegador actualizará su diseño, incluso si no muestra visiblemente para el usuario, cuando JavaScript solicita datos o mediciones del DOM. (Esta es la causa de [distribución de distribución] (http://wilsonpage.co.uk/preventing-layout-thrashing/).) –

+0

Ok, los hilos de renderizado parte es mi suposición sobre cómo el navegador maneja las actualizaciones de UI. Enfrenté este problema en mi código y lo solucioné usando la solución anterior. Incluso podría ser que el código de diseño se ejecute después de que la función finalice en el mismo hilo. No soy experto en cómo funciona el navegador – Bitonator

+1

Odio decir esto, pero creo que estás equivocado.Dudo que sea capaz de producir una reproducción simple del problema anterior (algunos jsfiddle), aislando el problema; '.append' es de hecho completamente sincrónico. Además, tenga en cuenta que JavaScript tiene un único subproceso y que no todas las cosas (incluido el navegador) están mutando de datos al mismo tiempo. –

Cuestiones relacionadas