Bir görüntünün ne zaman yükleneceğini bilmek istiyorum. Geri arama ile yapmanın bir yolu var mı?
Değilse, bunu yapmanın bir yolu var mı?
Bir görüntünün ne zaman yükleneceğini bilmek istiyorum. Geri arama ile yapmanın bir yolu var mı?
Değilse, bunu yapmanın bir yolu var mı?
Yanıtlar:
.complete
+ geri arama
Bu, ekstra bağımlılıkları olmayan standartlara uygun bir yöntemdir ve gereğinden fazla beklemez:
var img = document.querySelector('img')
function loaded() {
alert('loaded')
}
if (img.complete) {
loaded()
} else {
img.addEventListener('load', loaded)
img.addEventListener('error', function() {
alert('error')
})
}
Kaynak: http://www.html5rocks.com/en/tutorials/es6/promises/
img.complete
çağrı ile çağrı arasında tamamlanırsa bu yanlış olabilir addEventListener
mi?
load
olay dinleyicisi olay tetiklenmeden önce gerçekleşebileceği gibi bir maddede olmalıdır , bu nedenle eğer potansiyel olarak iki kez arayamazdınız (bunun yalnızca olay yangınları). else
img.complete
load
loaded
img.complete
Image.onload () genellikle işe yarar .
Bunu kullanmak için, src niteliğini ayarlamadan önce olay işleyiciyi bağladığınızdan emin olmanız gerekir.
İlgili Bağlantılar:
Örnek Kullanım:
window.onload = function () {
var logo = document.getElementById('sologo');
logo.onload = function () {
alert ("The image has loaded!");
};
setTimeout(function(){
logo.src = 'https://edmullen.net/test/rc.jpg';
}, 5000);
};
<html>
<head>
<title>Image onload()</title>
</head>
<body>
<img src="#" alt="This image is going to load" id="sologo"/>
<script type="text/javascript">
</script>
</body>
</html>
load
Etkinliğin geçerli olmadığını düşündüren neye bakıyorsunuz ? html.spec.whatwg.org/multipage/webappapis.html#handler-onload , onload
olay işleyicisinin tanımıdır .
Javascript image sınıfının .complete özelliğini kullanabilirsiniz.
Ekrana dinamik olarak eklenecek bir dizi görüntü nesnesini sakladığım bir uygulama var ve yüklenirken sayfadaki başka bir div için güncellemeler yazıyorum. İşte bir kod snippet'i:
var gAllImages = [];
function makeThumbDivs(thumbnailsBegin, thumbnailsEnd)
{
gAllImages = [];
for (var i = thumbnailsBegin; i < thumbnailsEnd; i++)
{
var theImage = new Image();
theImage.src = "thumbs/" + getFilename(globals.gAllPageGUIDs[i]);
gAllImages.push(theImage);
setTimeout('checkForAllImagesLoaded()', 5);
window.status="Creating thumbnail "+(i+1)+" of " + thumbnailsEnd;
// make a new div containing that image
makeASingleThumbDiv(globals.gAllPageGUIDs[i]);
}
}
function checkForAllImagesLoaded()
{
for (var i = 0; i < gAllImages.length; i++) {
if (!gAllImages[i].complete) {
var percentage = i * 100.0 / (gAllImages.length);
percentage = percentage.toFixed(0).toString() + ' %';
userMessagesController.setMessage("loading... " + percentage);
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
userMessagesController.setMessage(globals.defaultTitle);
}
Load () - olayını jQuery'de kullanabilirsiniz, ancak görüntü tarayıcı önbelleğinden yüklenirse her zaman tetiklenmez. Bu eklenti https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js bu sorunu çözmek için kullanılabilir.
Hayat jquery için çok kısa.
function waitForImageToLoad(imageElement){
return new Promise(resolve=>{imageElement.onload = resolve})
}
var myImage = document.getElementById('myImage');
var newImageSrc = "https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620"
myImage.src = newImageSrc;
waitForImageToLoad(myImage).then(()=>{
// Image have loaded.
console.log('Loaded lol')
});
<img id="myImage" src="">
src
JS ile ekleyerek kafa karıştırıcı görünmesini sağlıyorsunuz .
myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620
hile yapar.
İşte jQuery eşdeğeri:
var $img = $('img');
if ($img.length > 0 && !$img.get(0).complete) {
$img.on('load', triggerAction);
}
function triggerAction() {
alert('img has been loaded');
}
Sorunun sorulduğu 2008 için uygun değil, ancak bu günlerde bu benim için iyi çalışıyor:
async function newImageSrc(src) {
// Get a reference to the image in whatever way suits.
let image = document.getElementById('image-id');
// Update the source.
img.src = src;
// Wait for it to load.
await new Promise((resolve) => { image.onload = resolve; });
// Done!
console.log('image loaded! do something...');
}
bu işlevler sorunu çözecektir, DrawThumbnails
işlevi uygulamanız ve görüntüleri saklamak için küresel bir değişkeniniz olması gerekir. Bunu bir sınıf nesnesi ile çalışmak için seviyorumThumbnailImageArray
Üye değişken , ama mücadele !
olarak adlandırıldı addThumbnailImages(10);
var ThumbnailImageArray = [];
function addThumbnailImages(MaxNumberOfImages)
{
var imgs = [];
for (var i=1; i<MaxNumberOfImages; i++)
{
imgs.push(i+".jpeg");
}
preloadimages(imgs).done(function (images){
var c=0;
for(var i=0; i<images.length; i++)
{
if(images[i].width >0)
{
if(c != i)
images[c] = images[i];
c++;
}
}
images.length = c;
DrawThumbnails();
});
}
function preloadimages(arr)
{
var loadedimages=0
var postaction=function(){}
var arr=(typeof arr!="object")? [arr] : arr
function imageloadpost()
{
loadedimages++;
if (loadedimages==arr.length)
{
postaction(ThumbnailImageArray); //call postaction and pass in newimages array as parameter
}
};
for (var i=0; i<arr.length; i++)
{
ThumbnailImageArray[i]=new Image();
ThumbnailImageArray[i].src=arr[i];
ThumbnailImageArray[i].onload=function(){ imageloadpost();};
ThumbnailImageArray[i].onerror=function(){ imageloadpost();};
}
//return blank object with done() method
//remember user defined callback functions to be called when images load
return { done:function(f){ postaction=f || postaction } };
}
addThumbnailImages
fonksiyonunuz dahil, bu kodun çoğu önemsizdir . İlgili koda kadar parlat ve -1'i kaldıracağım.
Amaç, img, tarayıcı resmi oluşturduktan sonra biçimlendirmekse:
const img = new Image();
img.src = 'path/to/img.jpg';
img.decode().then(() => {
/* set styles */
/* add img to DOM */
});
çünkü önce tarayıcı loads the compressed version of image
, sonra decodes it
nihayet paints
. paint
tarayıcı decoded
img etiketine sahip olduktan sonra mantığınızı çalıştırmanız için herhangi bir etkinlik olmadığından .
React.js kullanıyorsanız, bunu yapabilirsiniz:
render() {
// ...
<img
onLoad={() => this.onImgLoad({ item })}
onError={() => this.onImgLoad({ item })}
src={item.src} key={item.key}
ref={item.key} />
// ...}
Nerede: