मैं करना चाहता हूँ:
$("img").bind('load', function() {
// do stuff
});
जब छवि को कैश से लोड किया जाता है तो लोड ईवेंट आग नहीं करता है। JQuery डॉक्स इसे ठीक करने के लिए एक प्लगइन का सुझाव देता है , लेकिन यह काम नहीं करता है
मैं करना चाहता हूँ:
$("img").bind('load', function() {
// do stuff
});
जब छवि को कैश से लोड किया जाता है तो लोड ईवेंट आग नहीं करता है। JQuery डॉक्स इसे ठीक करने के लिए एक प्लगइन का सुझाव देता है , लेकिन यह काम नहीं करता है
जवाबों:
यदि src
पहले से सेट है, तो ईवेंट कैश किए गए मामले में फायरिंग कर रहा है, इससे पहले कि आप इवेंट हैंडलर को बाध्य भी करें। इसे ठीक करने के लिए, आप .complete
इस तरह से ईवेंट के आधार पर जाँच और ट्रिगर कर सकते हैं :
$("img").one("load", function() {
// do stuff
}).each(function() {
if(this.complete) {
$(this).load(); // For jQuery < 3.0
// $(this).trigger('load'); // For jQuery >= 3.0
}
});
से परिवर्तन नोट .bind()
करने के लिए .one()
इतना ईवेंट हैंडलर दो बार नहीं चलता है।
setTimeout(function(){//do stuff},0)
'लोड' फ़ंक्शन के भीतर जोड़ूंगा ... 0 ब्राउज़र सिस्टम (DOM) को एक अतिरिक्त टिक देता है ताकि यह सुनिश्चित हो सके कि सब कुछ ठीक से अपडेट किया गया है।
.load()
ईवेंट को ट्रिगर नहीं करती है और इसमें 1 आवश्यक तर्क है, .trigger("load")
इसके बजाय का उपयोग करें
क्या मैं यह सुझाव दे सकता हूं कि आप इसे गैर-डोम छवि ऑब्जेक्ट में पुनः लोड करें? यदि इसे कैश किया जाता है, तो इसमें बिल्कुल भी समय नहीं लगेगा और ऑनलोड अभी भी चालू रहेगा। यदि इसे कैश नहीं किया जाता है, तो छवि लोड होने पर यह ऑनलोड को आग देगा, जो उसी समय होना चाहिए जब छवि का डोम संस्करण लोड हो रहा है।
जावास्क्रिप्ट:
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.src = $('#img').attr('src') ;
tmpImg.onload = function() {
// Run onload code.
} ;
}) ;
अद्यतन (कई छवियों को संभालने के लिए और सही ढंग से लोड किए गए अनुलग्नक के साथ):
$(document).ready(function() {
var imageLoaded = function() {
// Run onload code.
}
$('#img').each(function() {
var tmpImg = new Image() ;
tmpImg.onload = imageLoaded ;
tmpImg.src = $(this).attr('src') ;
}) ;
}) ;
load
हैंडलर से पहले यह जोड़ा है, भी इस काम नहीं करेगा, लेकिन एक छवि के लिए, कई के लिए :) ऑप्स कोड काम करता है
#img
एक आईडी नहीं एक तत्व चयनकर्ता है :) यह भी this.src
काम करता है, जहां यह आवश्यक नहीं है वहां jQuery का उपयोग करने की कोई आवश्यकता नहीं है :) लेकिन एक और छवि बनाने से ऐसा लगता है कि या तो मामले में IMO।
imageLoaded
, तो का उपयोगtmp.onload = imageLoaded.bind(this)
मेरा सरल समाधान, इसे किसी भी बाहरी प्लगइन की आवश्यकता नहीं है और सामान्य मामलों के लिए पर्याप्त होना चाहिए:
/**
* Trigger a callback when the selected images are loaded:
* @param {String} selector
* @param {Function} callback
*/
var onImgLoad = function(selector, callback){
$(selector).each(function(){
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
});
};
इसे इस तरह उपयोग करें:
onImgLoad('img', function(){
// do stuff
});
उदाहरण के लिए, लोड पर अपनी छवियों को फीका करने के लिए आप कर सकते हैं:
$('img').hide();
onImgLoad('img', function(){
$(this).fadeIn(700);
});
या विकल्प के रूप में, यदि आप एक jquery प्लगइन की तरह दृष्टिकोण पसंद करते हैं:
/**
* Trigger a callback when 'this' image is loaded:
* @param {Function} callback
*/
(function($){
$.fn.imgLoad = function(callback) {
return this.each(function() {
if (callback) {
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
}
});
};
})(jQuery);
और इसे इस तरह से उपयोग करें:
$('img').imgLoad(function(){
// do stuff
});
उदाहरण के लिए:
$('img').hide().imgLoad(function(){
$(this).fadeIn(700);
});
width
, max-height
और छोड़ दें height:auto
, अक्सर यह चौड़ाई और ऊंचाई दोनों को सेट करने के लिए आवश्यक है यदि आपको छवि को फैलाने की आवश्यकता है; एक और अधिक मजबूत समाधान के लिए मैं ImagesLaded
क्या आपको वास्तव में इसे jQuery के साथ करना है? आप onload
अपनी छवि पर सीधे घटना को संलग्न कर सकते हैं ;
<img src="/path/to/image.jpg" onload="doStuff(this);" />
यह हर बार छवि को लोड करेगा, कैश से या नहीं।
onload
जब छवि को दूसरी बार कैश से लोड किया जाता है तो क्या हैंडलर फायर करेगा ?
आप लोडिंग त्रुटि के समर्थन के साथ भी इस कोड का उपयोग कर सकते हैं:
$("img").on('load', function() {
// do stuff on success
})
.on('error', function() {
// do stuff on smth wrong (error 404, etc.)
})
.each(function() {
if(this.complete) {
$(this).load();
} else if(this.error) {
$(this).error();
}
});
load
पहले हैंडलर को सेट करना है और फिर बाद में each
फ़ंक्शन में कॉल करना है।
मेरे पास बस यह समस्या थी, हर जगह एक समाधान के लिए खोज की गई जिसमें मेरे कैश को मारने या प्लगइन डाउनलोड करना शामिल नहीं था।
मैंने इस धागे को तुरंत नहीं देखा, इसलिए मुझे इसके बजाय कुछ और मिला, जो एक दिलचस्प फिक्स है और (मुझे लगता है) यहां पोस्ट करने के योग्य है:
$('.image').load(function(){
// stuff
}).attr('src', 'new_src');
मुझे वास्तव में यहाँ टिप्पणियों से यह विचार मिला: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-use-jquery/
मुझे नहीं पता कि यह क्यों काम करता है, लेकिन मैंने IE7 पर इसका परीक्षण किया है और अब यह काम करने से पहले टूट गया।
आशा करता हूँ की ये काम करेगा,
स्वीकृत उत्तर वास्तव में बताते हैं कि क्यों:
यदि src पहले से सेट है, तो इवेंट हैंडलर बाउंड होने से पहले इवेंट कैश में फायरिंग कर रहा है।
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
मूल स्रोत को रीसेट करता था।
छवि के src के साथ एक नई छवि उत्पन्न करने के लिए jQuery का उपयोग करके, और लोड विधि को सीधे उस पर असाइन करते हुए, लोड विधि को सफलतापूर्वक कहा जाता है जब jQuery नई छवि उत्पन्न करता है। यह IE 8, 9 और 10 में मेरे लिए काम कर रहा है
$('<img />', {
"src": $("#img").attr("src")
}).load(function(){
// Do something
});
एक समाधान मुझे https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 मिला (यह कोड सीधे टिप्पणी से लिया गया है)
var photo = document.getElementById('image_id');
var img = new Image();
img.addEventListener('load', myFunction, false);
img.src = 'http://newimgsource.jpg';
photo.src = img.src;
GUS के उदाहरण में संशोधन:
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.onload = function() {
// Run onload code.
} ;
tmpImg.src = $('#img').attr('src');
})
ऑनलोड से पहले और बाद में स्रोत सेट करें।
src
संलग्न करने से पहले सेट करने की आवश्यकता नहीं है onload
, एक बार बाद में पर्याप्त होगा।
बस एक अलग लाइन पर src तर्क को फिर से जोड़ें के बाद img oject परिभाषित किया गया है। यह IE को लैड-इवेंट को ट्रिगर करने में धोखा देगा। यह बदसूरत है, लेकिन यह अब तक मुझे मिला सबसे सरल वर्कअराउंड है।
jQuery('<img/>', {
src: url,
id: 'whatever'
})
.load(function() {
})
.appendTo('#someelement');
$('#whatever').attr('src', url); // trigger .load on IE
मैं तुम्हें एक छोटी सी टिप दे सकता हूँ अगर तुम इस तरह से करना चाहते हो:
<div style="position:relative;width:100px;height:100px">
<img src="loading.jpg" style='position:absolute;width:100px;height:100px;z-index:0'/>
<img onLoad="$(this).fadeIn('normal').siblings('img').fadeOut('normal')" src="picture.jpg" style="display:none;position:absolute;width:100px;height:100px;z-index:1"/>
</div>
यदि आप ऐसा करते हैं कि जब ब्राउज़र चित्रों को कैश करता है, तो यह कोई समस्या नहीं है हमेशा दिखाया गया है लेकिन वास्तविक चित्र के तहत आईएमजी लोड हो रहा है।
मैं IE के साथ यह समस्या थी जहाँ e.target.width अपरिभाषित होगा। लोड घटना में आग लग जाएगी लेकिन मैं IE में छवि के आयाम नहीं प्राप्त कर सका (क्रोम + एफएफ ने काम किया)।
पता चलता है कि आप e.currentTarget.naturalWidth और e.currentTarget.naturalHight को देखना चाहते हैं ।
एक बार फिर, आईई चीजों को अपने ही (अधिक जटिल) तरीके से करता है।
आप JAIL प्लगइन का उपयोग करके अपनी समस्या को हल कर सकते हैं जो आपको आलसी लोड छवियों (पृष्ठ प्रदर्शन में सुधार) और कॉलबैक को पैरामीटर के रूप में पारित करने की अनुमति देता है
$('img').asynchImageLoader({callback : function(){...}});
HTML जैसा दिखना चाहिए
<img name="/global/images/sample1.jpg" src="/global/images/blank.gif" width="width" height="height" />
यदि आप एक शुद्ध सीएसएस समाधान चाहते हैं, तो यह ट्रिक बहुत अच्छी तरह से काम करती है - ट्रांसफॉर्म ऑब्जेक्ट का उपयोग करें। कैश होने या न होने पर भी यह चित्रों के साथ काम करता है:
सीएसएस:
.main_container{
position: relative;
width: 500px;
height: 300px;
background-color: #cccccc;
}
.center_horizontally{
position: absolute;
width: 100px;
height: 100px;
background-color: green;
left: 50%;
top: 0;
transform: translate(-50%,0);
}
.center_vertically{
position: absolute;
top: 50%;
left: 0;
width: 100px;
height: 100px;
background-color: blue;
transform: translate(0,-50%);
}
.center{
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
background-color: red;
transform: translate(-50%,-50%);
}
HTML:
<div class="main_container">
<div class="center_horizontally"></div>
<div class="center_vertically"></div>
<div class="center"></div>
</div>
</div