2011-02-12 17 views
5

में लोड होने के बाद कैश से लोड नहीं हो रही है, मैं एक आईफ्रेम में एक छवि लोड कर रहा हूं और फिर (अगर आईफ़्रेम लोड हो जाता है) पृष्ठ पर छवि लोड कर रहा है। लेकिन अधिकांश ब्राउज़र छवि को दो बार लोड कर रहे हैं। कैश से लोड होने वाले img टैग क्यों नहीं है?छवि आईफ़्रेम

कुछ इस तरह:

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

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

मैं fiddler2 उपयोग कर रहा हूँ नेटवर्क यातायात को देखने के लिए।

मामले में आप को पता है क्यों मैं ऐसा करना चाहते हैं चाहते हैं, this question

उत्तर

0

की जाँच करने के बाद एक iframe एक अलग टैब होने की तरह है, यह एक और ब्राउज़र उदाहरण का उपयोग करता है, इस कारण के लिए मेरा मानना ​​है कि इसे का उपयोग नहीं कर रहा है कैश।

फिर भी अगर आप क्या चाहते हैं चित्र पूर्व लोड चल रहा है, आप जावास्क्रिप्ट

+0

हाँ तुम सिर्फ उपयोग कर सकते हैं '(नई छवि()) src =" http://www.example.com/myimage.jpg "' और यह आपकी छवि को प्रीलोड करेगा। –

+0

@Adam ऐसा नहीं है जो मैं करना चाहता हूं। यदि आप अन्य प्रश्न पढ़ते हैं, तो आप समझ जाएंगे कि मैं इसे iframe में क्यों लोड करना चाहता हूं http://stackoverflow.com/questions/4926215/cancel-single-image-request-in-html5-browsers/4979270 – Amir

+0

कैश साझा किया जाता है ... यही कारण है कि सीडीएन नेटवर्क (जैसे Google और माइक्रोसॉफ्ट) मेजबान सामान एक ही स्थान पर jQuery की तरह: http://code.google.com/apis/libraries/devguide.html – Amir

0

में new Image() उपयोग कर सकते हैं हो सकता है कि आप HTTP हेडर, जो कैशिंग को रोकने भेजने? यदि आप उपयोगकर्ता को छवि भेजने और सत्र शुरू करने के लिए PHP का उपयोग करते हैं, तो PHP हर समय छवि को फिर से लोड करने के लिए शीर्षलेख सेट करेगा।

+0

नहीं ... सेट 'use_unique_name = false 'और यदि आप यातायात देखते हैं, तो आप देखेंगे कि यह कैश हो जाता है। – Amir

0

। Htaccess का उपयोग कैशिंग को बेहतर बनाने के लिए किया जा सकता है और आप PHP में हेडर सेट भी कर सकते हैं। मैं .htaccess का उपयोग करता हूं: यदि छवि एक बार लोड हो गई है और आपने कोई बदलाव नहीं किया है, तो इसे कैश से लोड किया जाएगा। यह व्यवहार अन्य प्रकार की फ़ाइलें के लिए सेट किया जा सकता (देखें नीचे):

.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

जैसा ऊपर बताया गया है, यहां समस्या कैशिंग नहीं है। फाइल कैश हो जाती है। – Amir

0

मैं इस नए संस्करण के साथ परीक्षण किया है और यह काम करता है, कैशिंग के लिए प्रयोग किया जाता है दूसरी छवि, आईई 7 & एफएफ 3.6 पर परीक्षण किया गया। अंतर मैं जिस तरह से लोड() jQuery कॉलबैक में img src विशेषता सेट करता हूं (लेकिन मेरे लिए एक रहस्य क्यों बना रहता है)।

इस उदाहरण में सावधान रहें, मैंने वास्तव में अंतर देखने के लिए विशाल छवि का उपयोग किया।

$(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); 
}); 

संपादित बेला लिंक:। http://jsfiddle.net/regilero/g8Hfw/

+0

दुर्भाग्यवश, यह केवल आईई 9.0.8080 के तहत मेरे लिए काम करता है। यह परीक्षण किए गए अन्य ब्राउज़रों पर छवि को दो बार लोड करता है: क्रोम 9.0.597.98, फ़ायरफ़ॉक्स 3.6.13, और सफारी 5.0.3। – Amir

+0

अजीब, एफएफ 3.6 पर अच्छी तरह से काम करता है।11, जब आप कहते हैं कि यह छवि को दो बार लोड करता है, तो आपका मतलब है कि छवि को दो बार लोड करने में कई सेकंड लगते हैं? – regilero

+0

@ एमीर: एफएफ 3.6.11, क्रोम 9.0.597.98, आईई 7.0.5730.13, आईई 8.0.7600.16385 पर सफलता के साथ परीक्षण किया गया। क्या आप पूरी तरह से सुनिश्चित हैं कि छवि अनुरोध दूसरी बार कई सेकंड लेता है? जो मैंने देखा वह केवल सफारी इस त्रुटि को बिना कैश के मजबूर रीलोड पर कर सकता है। – regilero

संबंधित मुद्दे