2011-02-12 12 views
5

Estoy cargando una imagen en un iframe y luego (una vez cargado el iframe) cargando la imagen en la página. Pero la mayoría de los navegadores parecen estar cargando la imagen dos veces. ¿Por qué la etiqueta img no se está cargando desde la memoria caché?La imagen no se carga desde la memoria caché después de cargarla en un iframe

Algo como esto:

var loader = $('<iframe />').appendTo('body')[0]; 
loader.onload = function() { 
    $('body').append('<img src="' + imgsrc + '" />'); 
}; 
loader.src = imgsrc; 

http://jsfiddle.net/amirshim/na3UA/

estoy usando fiddler2 para ver el tráfico de la red.

En caso de que quiera saber por qué quiero hacer esto, echa un vistazo a this question

Respuesta

0

Tener un iframe es como tener una ficha independiente, que usa otra instancia del navegador, por esta razón creo que no está utilizando el cache.

embargo, si lo que quiere es tener la imagen pre cargado, puede utilizar new Image() en javascript

+0

Sí sólo se puede usar '(nueva imagen()) src = "http://www.example.com/myimage.jpg" y' precargará tu imagen. –

+0

@ Adam. Eso no es lo que quiero hacer. Si lee la otra pregunta, comprenderá por qué quiero cargarla en un iframe http://stackoverflow.com/questions/4926215/cancel-single-image-request-in-html5-browsers/4979270 – Amir

+0

El caché es compartido ... es por eso que las redes de CDN (como google y microsoft) alojan cosas como jQuery en un solo lugar: http://code.google.com/apis/libraries/devguide.html – Amir

0

Tal vez de enviar las cabeceras HTTP, que impiden el almacenamiento en caché? Si usa PHP para enviar la imagen al usuario e iniciar una sesión, PHP establecerá encabezados obligando a recargar la imagen todo el tiempo.

+0

No ... establece 'use_unique_name = false 'y si observa el tráfico, verá que se almacena en caché. – Amir

0

.htaccess se puede utilizar para mejorar el almacenamiento en caché y también se pueden establecer encabezados en PHP. Uso .htaccess: si la imagen se ha cargado una vez y no ha realizado ningún cambio, se cargará desde la memoria caché. Este comportamiento puede ser configurado para otros tipos de archivos (ver más abajo):

.htaccess

# BEGIN Expire headers 
<IfModule mod_expires.c> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 seconds" 
    ExpiresByType image/x-icon "access plus 2 months" 
    ExpiresByType image/jpeg "access plus 2 months" 
    ExpiresByType image/png "access plus 2 months" 
    ExpiresByType image/gif "access plus 2 months" 
    ExpiresByType application/x-shockwave-flash "access plus 2 months" 
    ExpiresByType text/css A15552000 
    ExpiresByType text/javascript "access plus 2 months" 
    ExpiresByType application/x-javascript "access plus 2 months" 
    ExpiresByType text/html "access plus 600 seconds" 
    ExpiresByType application/xhtml+xml "access plus 600 seconds" 
</IfModule> 
# END Expire headers 
# BEGIN Cache-Control Headers 
<IfModule mod_headers.c> 
    <FilesMatch "\\.(ico|jpe?g|png|gif|swf)$"> 
    Header set Cache-Control "max-age=15552000, public" 
</FilesMatch> 
<FilesMatch "\\.(css)$"> 
    Header set Cache-Control "max-age=2678400, public" 
</FilesMatch> 
<FilesMatch "\\.(js)$"> 
    Header set Cache-Control "max-age=2678400, private" 
</FilesMatch> 
<FilesMatch "\\.(x?html?|php)$"> 
    Header set Cache-Control "max-age=600, private, must-revalidate" 
</FilesMatch> 

+0

Como se mencionó anteriormente, el problema aquí no es el almacenamiento en caché. El archivo se almacena en caché. – Amir

0

He probado con esta nueva versión y funciona, el almacenamiento en caché se utiliza para la segunda imagen, probada en IE7 & FF3.6. la diferencia está en la forma en que configuro el atributo img src en load() jQuery callback (pero por qué sigue siendo un misterio para mí).

Tenga cuidado en este ejemplo utilicé una gran imagen de para realmente ver la diferencia.

$(function() { 
    var use_unique_name = true; 

    var imgsrc = 'http://www.challey.com/WTC/wtc_huge.jpg'; 
    if (use_unique_name) { 
     var ts = +(new Date()); 
     // try replacing _= if it is there 
     var ret = imgsrc.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); 
     // if nothing was replaced, add timestamp to the end 
     imgsrc = imgsrc + ((ret == imgsrc) ? (imgsrc.match(/\?/) ? "&" : "?") + "_=" + ts : ""); 
    } 

    var loader = $('<iframe />').appendTo('body'); 

    loader.load(function() { 
     var img = jQuery('<img src="#"/>'); 
     $('body').append(img); 
     img.attr('src',imgsrc); 
    }); 

    loader.attr('src', imgsrc); 
}); 

enlace editar violín:. http://jsfiddle.net/regilero/g8Hfw/

+0

Lamentablemente, solo funciona para mí en IE 9.0.8080. Carga la imagen dos veces en los otros navegadores que probé: Chrome 9.0.597.98, Firefox 3.6.13 y Safari 5.0.3. – Amir

+0

extraño, funciona bien en FF 3.6.11, cuando dices que carga la imagen dos veces, ¿te refieres a que la imagen tarda varios segundos en cargarse dos veces? – regilero

+0

@Amir: probado con éxito en FF 3.6.11, Chrome 9.0.597.98, IE 7.0.5730.13, IE 8.0.7600.16385. ¿Estás completamente seguro de que la solicitud de imagen tarda varios segundos la segunda vez? Por lo que vi, solo Safari podría cometer este error en la recarga forzada sin caché. – regilero

Cuestiones relacionadas