2010-12-20 12 views
7

Estoy cargando en algo de HTML a través de AJAX, necesito un evento para atrapar a cuando se cargan las nuevas imágenes ...jQuery: acontecimiento para cuando el contenido ajax cargado es de todos cargados (incluyendo imágenes)

becuase que está en un div y no una página entera, no se puede utilizar $(window).load(....

he intentado lo siguiente pero no funciona:

$('.banners_col img:last').load(function(){..... 
+2

¡Hola, buena pregunta! –

+0

Pl publicar alguna muestra amt del código –

Respuesta

7

es necesario apuntar a los resultados de la llamada AJAX antes de insertarlos en el dom.

Por lo tanto, debe utilizar el método de devolución de llamada proporcionado por jQuery por este motivo.

$('#load').click(function(){ 
    // inside the handler that calls the ajax 

    //you ajax call here 
    $.get('the_url_to_fetch',function(data){ 

     // create an in-memory DOM element, and insert the ajax results 
     var $live = $('<div>').html(data); 

     // apply a load method to the images in the ajax results 
     $('img',$live).load(function(){ 
      // what to do for each image that is loaded 
     }); 

     // add the ajax results in the DOM 
     $('selector_where_to_put_the_response').html($live.children()); 
    }); 

}); 

ejemplo en http://www.jsfiddle.net/gaby/Sj7y2/


Si hay varias imágenes en la respuesta Ajax y desea ser notificado cuando todo de ellos se cargan a continuación, utilizar esta versión ligeramente modificada

$('#load').click(function(){ 
    // inside the handler that calls the ajax 

    //you ajax call here 
    $.get('the_url_to_fetch',function(data){ 

     // create an in-memory DOM element, and insert the ajax results 
     var $live = $('<div>').html(data); 
     // count the number of images 
     var imgCount = $live.find('img').length; 

     // apply a load method to the images in the ajax results 
     $('img',$live).load(function(){ 
      // what to do for each image that is loaded 

      imgCount--; 
      if (imgCount==0) 
      { 
       // the code in here is called when all images have loaded. 
      } 
     }); 

     // add the ajax results in the DOM 
     $('selector_where_to_put_the_response').html($live.children()); 
    }); 

}); 

ejemplo en http://www.jsfiddle.net/gaby/Sj7y2/1/


Si elimina los comentarios y las líneas vacías, que no es mucho código :) por lo que no se dejan intimidar ..

+1

lo siento, no he respondido antes. Acabo de darle a esta solución una prueba exhaustiva y casi está allí. El único problema que estoy encontrando es que parece que las imágenes del caché no causan un evento '.load()', así que en el caso de imágenes en caché el img_count se queda corto .... ¿alguna idea? – Haroldo

+0

@Haroldo, funciona bien para mí ... Si revisas el segundo enlace (ejemplo) si ejecutas el código, el evento de carga se dispara nuevamente aunque estén en caché ... ¿estás seguro de que no está sucediendo nada más? ? Si puede poner un ejemplo en vivo de que su código no funciona, sería útil. –

+0

Esta solución funciona muy bien. Si desea que se muestre algo así como un cuadro de diálogo "Cargando ..." mientras se cargan las imágenes y luego elimina el cuadro de diálogo cuando se cargó la última imagen, modifiqué el código anterior para adjuntar el método load() a la última imagen tag: $ ('img: last', $ live) .load (function() {...}); –

-3

Trate de usar la función en vivo para desencadenar eventos para los elementos HTML desde ajax

$('.banners_col img:last').live('change',function(){..... 
+3

Esto está mal. El evento 'change' se activa solo para los elementos' input'/'textarea' /' select'. Consulte la [documentación] (http://api.jquery.com/change/). –

Cuestiones relacionadas