2011-04-11 13 views
14

मैं कुछ बहुत बुनियादी jQuery कोड है:jQuery .load() चित्र पर फायरिंग नहीं (शायद कैशिंग?)

... 
$(this).find('img').load(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
... 

हालांकि, लगातार फायरिंग नहीं thats। अगर मैं हार्ड रीफ्रेश करता हूं या अपना ब्राउज़र बंद करता हूं, लेकिन सामान्य रीफ्रेश करता हूं, या कैश को मिटाने के बिना किसी भी समय दो बार एक ही यूआरएल को मारता है तो .load() कभी भी आग नहीं डालता है।

इसे ठीक करने के तरीके पर कोई विचार?

+0

देखें सौभाग्य से, एक संपत्ति .complete है कि आप उपयोग कर सकते हैं प्रासंगिक उत्तर [यहां] (http://stackoverflow.com/questions/126772/how-to-force-a-web-browser-not-to-cache-images) –

+0

यह धन्यवाद! उन उत्तरों को पढ़ने के बाद मेरा अधिक विशिष्ट उत्तर देखें! –

उत्तर

4

एक तरह से यूआरएल है कि आप इस तरह के एक क्वेरी स्ट्रिंग परम के रूप में संलग्न मिलीसेकेंड में समय के रूप में छवि हड़पने के लिए ... का उपयोग के अंत में एक "डमी चर" जोड़ने के लिए किया जाएगा।

+0

बिल्कुल सही, यह काम किया! –

+0

यह कच्चा नहीं है, यह सामान्य अभ्यास है। :) –

+0

@Diodeus - बहुत सच है ... मैं पोस्ट संपादित करूंगा ताकि यह इतनी बीमार कल्पना न हो ... धन्यवाद। –

3

के रूप में रॉन और एल ग्वापो ने कहा, इस सवाल का जवाब URL के अंत में एक प्रश्न जोड़ना है। मैंने ऐसा किया:

$(this).find('img').each(function(){ 
    $(this).attr('src',$(this).attr('src')+'?'+new Date().getTime()) 
}).load(function(){ 
    //This will always run now! 
+0

अच्छा काम यह दिखा रहा है !!!! –

+3

जबकि यह मूल प्रश्न का उत्तर देता है, यह आपकी छवियों को ब्राउज़र द्वारा कैश किया जा रहा है, आदर्श नहीं है क्योंकि यह पृष्ठ लोडिंग को धीमा कर देगा। –

40

मुझे लगता है कि यह has been discussed before है। यह प्रति कैशिंग नहीं है जो समस्या है लेकिन समय: इवेंट हैंडलर संलग्न होने तक छवियों को पहले ही लोड किया जा सकता है (इसलिए इसे कभी नहीं निकाल दिया जाता है)। यह तब भी हो सकता है जब कोई कैशिंग न हो, उदाहरण के लिए एक बहुत तेज़ कनेक्शन पर एक बहुप्रचारित ब्राउज़र में।

var load_handler = function() { 
    loadedImages++; 
    … 
} 
$(this).find('img').filter(function() { 
    return this.complete; 
}).each(load_handler).end().load(load_handler); 

आप अपना स्वयं का घटना समारोह देते हैं बना सकते हैं::

jQuery.fn.extend({ 
    ensureLoad: function(handler) { 
     return this.each(function() { 
      if(this.complete) { 
       handler.call(this); 
      } else { 
       $(this).load(handler); 
      } 
     }); 
    } 
}); 

और फिर यह फोन इस प्रकार है:

$(this).find('img').ensureLoad(function(){ 
    loadedImages++; 
    if(loadedImages == $this.find('img').length){ 
    … 
}); 
+0

मामले में आप गतिशील रूप से बदल रहे हैं 'छवि के src' और" लोड "घटना पर भरोसा करते हैं इसके साथ कुछ करने के लिए जब यह लोड करता है, तो आप लोड मैन्युअल ट्रिगर कर सकते हैं, तो छवि तो जैसे पहले से ही द्वारा कैश में है:' image.attr (' src ', ); अगर (छवि [0] .complete) {image.trigger ('load')} ' – hakunin

+1

यह एक बहुत ही सुरुचिपूर्ण समाधान है, जिसे स्वीकार किए गए एक से बेहतर जवाब है। जिसे स्वीकार किया गया वह एक कच्चा समाधान है लेकिन यह कैशिंग को भी रोकता है। मेरे ऐप में, 30+ उच्च रेज फोटो दिखाए जा रहे हैं, इसलिए मुझे एक समस्या थी जहां पहले लोड में कुछ समय लगेगा जब तक कि सभी छवियों को लोड नहीं किया जाता है और आकार की गणना की जाती है (प्रत्येक बार भिन्न आकार), और फिर से मिलने पर, कैश लोड() को बिल्कुल भी आग लगने का कारण नहीं था। यदि मैं कैशिंग अक्षम करता हूं तो विज़िटर आने पर प्रत्येक बार लोड होने में लंबा समय लगेगा। – jeffkee

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