আমি করতে চাই:
$("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 0 সমস্ত কিছু সঠিকভাবে আপডেট হয়েছে তা নিশ্চিত করার জন্য ব্রাউজার সিস্টেমকে (ডিওএম) একটি অতিরিক্ত টিক দেয়।
.load()
ইভেন্টটি ট্রিগার করে না এবং এর জন্য 1 টি প্রয়োজনীয় যুক্তি রয়েছে, তার .trigger("load")
পরিবর্তে ব্যবহার করুন
আমি কি আপনাকে পরামর্শ দিতে পারি যে আপনি এটিকে একটি নন-ডোম চিত্র অবজেক্টে পুনরায় লোড করুন? যদি এটি ক্যাশে করা হয় তবে এগুলিতে কোনও সময় লাগবে না, এবং অনলোডটি এখনও চালু থাকবে। যদি এটি ক্যাশে না করা হয় তবে চিত্রটি লোড হওয়ার পরে এটি লোডটিকে অগ্নিকাণ্ডে জ্বালিয়ে দেবে, যা চিত্রটির ডিওএম সংস্করণ লোডিং শেষ হওয়ার সাথে সাথে হওয়া উচিত।
javascript:
$(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 ব্যবহার করার দরকার নেই :) তবে অন্য চিত্র তৈরি করা আইএমও উভয় ক্ষেত্রেই ওভারকিলের মতো বলে মনে হচ্ছে।
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);
});
আপনার কি সত্যিই 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- using-jquery/
এটি কেন কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই তবে আমি এটি আই 7 এ পরীক্ষা করে দেখেছি এবং এটি এখন কাজ করার আগে কোথায় এটি ভেঙে গেছে।
আশা করি এটা সাহায্য করবে,
গৃহীত উত্তর আসলে ব্যাখ্যা করে যে:
যদি এসআরসি ইতিমধ্যে সেট করা থাকে তবে ইভেন্ট হ্যান্ডলারটি সীমাবদ্ধ করার আগে ইভেন্টটি ক্যাশে কেসে ইভেন্টটি ফায়ার করছে।
$image.load(function(){ something(); }).attr('src', $image.attr('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;
জিইএস-এর উদাহরণে একটি পরিবর্তন:
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.onload = function() {
// Run onload code.
} ;
tmpImg.src = $('#img').attr('src');
})
অনলোডের আগে এবং পরে উত্সটি সেট করুন।
src
সংযুক্তির আগে সেট করার দরকার নেই onload
, এর পরে একবারে যথেষ্ট হবে।
Img অবজেক্টটি সংজ্ঞায়িত হওয়ার পরে একটি পৃথক লাইনে src যুক্তিটি পুনরায় যুক্ত করুন। এটি আইডিকে ল্যাড-ইভেন্টটি ট্রিগার করতে সক্ষম করবে। এটি কুরুচিপূর্ণ তবে এটি এখন পর্যন্ত আমি খুঁজে পাওয়া সবচেয়ে সহজ কাজ।
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>
আপনি যদি এটি করেন যখন ব্রাউজারটি ছবিগুলি ক্যাশে করে, এটি সবসময়ই ইম্জি প্রদর্শিত হয় না তবে বাস্তব চিত্রের অধীনে আইএমজি লোড হয়।
আইইয়ের সাথে আমার এই সমস্যাটি ছিল যেখানে e.target.width অপরিজ্ঞাত হবে। লোড ইভেন্টটি আগুন লাগবে তবে আমি ছবিতে চিত্রের মাত্রা পেতে পারি না (ক্রোম + এফএফ কাজ করেছে)।
আপনি দেখতে পেলেন আপনার জন্য eCurrentTarget.n NaturalWidth এবং e.currentTarget.n NaturalHight ।
আবার, IE নিজের (আরও জটিল) উপায়ে জিনিসগুলি করে।
আপনি JAIL প্লাগইন ব্যবহার করে আপনার সমস্যার সমাধান করতে পারেন যা আপনাকে অলস লোড চিত্রগুলি (পৃষ্ঠার কার্যকারিতা উন্নতি করতে) এবং কলব্যাকটিকে প্যারামিটার হিসাবে পাস করার অনুমতি দেয়
$('img').asynchImageLoader({callback : function(){...}});
এইচটিএমএলের মতো দেখতে হবে
<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%);
}
এইচটিএমএল:
<div class="main_container">
<div class="center_horizontally"></div>
<div class="center_vertically"></div>
<div class="center"></div>
</div>
</div