Cargar imágenes de forma asíncrona con jQuery


Quiero cargar imágenes externas en mi página de forma asíncrona usando jQuery y he intentado lo siguiente:

$.ajax({ 
   url: "http://somedomain.com/image.jpg", 
   timeout:5000,
   success: function() {

   },
   error: function(r,x) {

   }
});

Pero siempre devuelve error, ¿es posible cargar una imagen como esta?

Traté de usar .load método y funciona, pero no tengo idea de cómo puedo establecer el tiempo de espera si la imagen no está disponible (404). ¿Cómo puedo hacer esto?

Author: Gras Double, 2010-11-26

10 answers

No hay necesidad de ajax. Puede crear un nuevo elemento de imagen, establecer su atributo de origen y colocarlo en algún lugar del documento una vez que haya terminado de cargarse:

var img = $("<img />").attr('src', 'http://somedomain.com/image.jpg')
    .on('load', function() {
        if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
            alert('broken image!');
        } else {
            $("#something").append(img);
        }
    });
 193
Author: karim79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-29 12:30:22

SI REALMENTE NECESITA USAR AJAX...

Llegué a través de casos de uso donde los manejadores de carga no eran la elección correcta. En mi caso al imprimir a través de javascript. Así que en realidad hay dos opciones para usar el estilo AJAX para esto:

Solución 1

Utilice datos de imagen Base64 y un servicio de imagen REST. Si tiene su propio servicio web, puede agregar un script REST JSP/PHP que ofrezca imágenes en codificación Base64. Ahora, ¿cómo es eso útil? Me encontré con una nueva sintaxis para codificación de imagen:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhE..."/>

Para que pueda cargar los datos de la imagen Base64 utilizando Ajax y luego al finalizar, construya la cadena de datos Base64 en la imagen. Muy divertido:). Recomiendo usar este sitio http://www.freeformatter.com/base64-encoder.html para la codificación de imágenes.

$.ajax({ 
    url : 'BASE64_IMAGE_REST_URL', 
    processData : false,
}).always(function(b64data){
    $("#IMAGE_ID").attr("src", "data:image/png;base64,"+b64data);
});

Solución 2:

Engañar al navegador para que use su caché. Esto le da una buena fadeIn () cuando el recurso está en la caché del navegador:

var url = 'IMAGE_URL';
$.ajax({ 
    url : url, 
    cache: true,
    processData : false,
}).always(function(){
    $("#IMAGE_ID").attr("src", url).fadeIn();
});   

Sin embargo, ambos métodos tienen su inconvenientes: El primero solo funciona en navegadores modernos. El segundo tiene fallos de rendimiento y se basa en la suposición de cómo se utilizará la caché.

Saludos, will

 70
Author: willsteel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 08:34:26

Usando jQuery puede simplemente cambiar el atributo "src" a "data-src". La imagen no se cargará. Pero la ubicación se almacena con la etiqueta. Que me gusta.

<img class="loadlater" data-src="path/to/image.ext"/>

Una simple pieza de jQuery copia data-src a src, que comenzará a cargar la imagen cuando la necesite. En mi caso cuando la página ha terminado de cargarse.

$(document).ready(function(){
    $(".loadlater").each(function(index, element){
        $(element).attr("src", $(element).attr("data-src"));
    });
});

Apuesto a que el código jQuery podría ser abreviado, pero es comprensible de esta manera.

 10
Author: htho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-14 17:39:04
$(<img />).attr('src','http://somedomain.com/image.jpg');

Debería ser mejor que ajax porque si es una galería y estás recorriendo una lista de fotos, si la imagen ya está en caché, no enviará otra solicitud al servidor. Solicitará en el caso de jQuery / ajax y devolverá un HTTP 304 (No modificado) y luego utilizará la imagen original de la caché si ya está allí. El método anterior reduce una solicitud vacía al servidor después del primer bucle de imágenes en la galería.

 7
Author: Jaseem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-15 13:39:07

Puede utilizar un objeto Diferido para la carga ASÍNCRONA.

function load_img_async(source) {
    return $.Deferred (function (task) {
        var image = new Image();
        image.onload = function () {task.resolve(image);}
        image.onerror = function () {task.reject();}
        image.src=source;
    }).promise();
}

$.when(load_img_async(IMAGE_URL)).done(function (image) {
    $(#id).empty().append(image);
});

Por favor, preste atención: imagen.onload debe estar antes de la imagen.src para evitar problemas con la caché.

 4
Author: phpcoding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-20 20:31:38

Si solo desea establecer el origen de la imagen, puede usar esto.

$("img").attr('src','http://somedomain.com/image.jpg');
 3
Author: slobodan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-29 12:33:12

Esto también funciona ..

var image = new Image();
image.src = 'image url';
image.onload = function(e){
  // functionalities on load
}
$("#img-container").append(image);
 3
Author: Basilin Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-02 13:49:25

AFAIK usted tendría que hacer un .load () función aquí como apposed a la .ajax (), pero puedes usar jQuery setTimeout para mantenerlo activo (ish)

<script>
 $(document).ready(function() {
 $.ajaxSetup({
    cache: false
});
 $("#placeholder").load("PATH TO IMAGE");
   var refreshId = setInterval(function() {
      $("#placeholder").load("PATH TO IMAGE");
   }, 500);
});
</script>
 2
Author: benhowdle89,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-26 11:53:51

Uso .cargar para cargar tu imagen. para probar si obtienes un error (digamos 404 ) puedes hacer lo siguiente:

$("#img_id").error(function(){
  //$(this).hide();
  //alert("img not loaded");
  //some action you whant here
});

Cuidado - .el evento error () no se activará cuando el atributo src esté vacío para una imagen.

 2
Author: Poelinca Dorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-22 21:21:27

Function (function () {

    if ($('#hdnFromGLMS')[0].value == 'MB9262') {
        $('.clr').append('<img src="~/Images/CDAB_london.jpg">');
    }
    else
    {
        $('.clr').css("display", "none");
        $('#imgIreland').css("display", "block");
        $('.clrIrland').append('<img src="~/Images/Ireland-v1.jpg">');
    }
});
 0
Author: MadhaviLatha Bathini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-20 06:46:16