Javascript image preloader (oop?)
Sziasztok. Egy image preloadert szeretnék írni, a képeket pedig utána megjeleníteni egy canvas elemen. A célom az lenne, hogy legyen egy feltöltött object-em, amin belül így hivatkoznék a képekre pl: images.elso, images.masodik stb.
Innen hívom meg:ez pedig az imagesRepository tartalma:Odáig műkodik a dolog, hogy 2x belefut az image onloadba, viszont nem tudom innen hogyan kéne visszaadni az imagesRepository()-nak a feltöltött tömböt, hogy aztán elvégezhessem az objektum feltöltését.
Még csak most próbálgatom a javascript oop-t szóval nézzétek el, ha valami gyermeteg hibát vétettem.
■ Innen hívom meg:
window.onload = function(){
c = document.getElementById('canvas')
ctx = c.getContext('2d');
var images = new imagesRepository();
ctx.drawImage (images.elso, 0, 0);
ctx.drawImage(images.masodik, 200, 200);
}
function imagesRepository(){
//set all the images here!
//TODO implement: get images from config file
var imagesArray = ["elso.jpg", "masodik.jpg"];
var images = new Array();
images = this.preload(imagesArray);
this.elso = images[0];
this.masodik = images[1];
}
imagesRepository.prototype.preload = function (imagesArray){
var imagesCollection = new Array();
var imageCount = 0;
for (var i in imagesArray){
imagesCollection[i] = new Image();
imagesCollection[i].src = "images/" + imagesArray[i];
imagesCollection[i].onload = function() {
imageCount++;
if (imageCount >= imagesArray.length){
return imagesCollection;
}
};
}
}
Még csak most próbálgatom a javascript oop-t szóval nézzétek el, ha valami gyermeteg hibát vétettem.
callback
Úgy kéne megoldanod, hogy az onload eseményben, ha minden kép betöltött (itt ügyelni kellene amúgy az esetleges hibákra, mi van, ha nem tölt be a kép? Az imageCount mindig kisebb lesz a tömb méreténél!), akkor meghívsz valami callback függvényt.
Köszönöm szépen
Eddig PHP-ben OOP-ztem, nem jutott volna eszembe, hogy osztályon "kívül" definiáljak egy osztálymetódust, pl imageRepository() is egy külön js fileban van. Ez nekem így kicsit fura, de elfogadom, hogy itt igy a célszerűbb. (Bár kérdés, hogy ez mennyire teszi átláthatatlanná a kódot.)
A var that = this; is érdekes, ezt ki tudnád egy kicsit fejteni?
Kérdésedre a válasz: úgy gondoltam így könnyebb lesz később hivatkozni a képekre, egy egyszerű kis játékot szeretnék, ami elemekből épül fel, tehát egy img elemet többször szeretnék használni. Te milyen megoldást javasolsz?
A that azért kell, mert az
A megoldást tovább lehetne fejlesztni, ha az Observer pattern-szerűen, a "ready" eseményre te csak függvényeket regisztrálnál be, tehát a ready meg van írva az imageRepository "közelében", és az addEventListener (ez csak példa név, node.js-ben tipikusan úgy van megoldva, hogy az on(esemeny, callback) hívással lehet feliratkozni egy eseményre), amit szintén valahol a "közelében" írsz meg, bárhol meghívható, így nem szórja szét az osztály/objektum kódját.
Azt hittem valami képgaléria szerűt csinálsz, úgy nyilván érdemesebb lett volna számmal indexelni. De így már van létjogosultsága. De (szerintem) akkor sem az imageRepository névterét kellene szennyezni vele, hanem létrehozni neki benne valami gyűjtőt, amibe lehet nyugodtan pakolni. De ez már tényleg csak gusztus dolga.
úgy tippelem maga a
A tipped helyes :)
Ha eddig csak PHP-ben
Szerintem egyáltalán nem
Ha már mindenképpen el akarod
Egyébként CSS-el is lehet preload-olni, ha nem akarsz javascriptet használni...
Egyébként CSS-el is lehet preload-olni
Ez engem nagyon érdekelne! Megírnád?
CSS preload
Okés. Nem nagyon követem a
Én írtam egyet csak nem
- Kell egy
ImageLoader
osztály.- Átadsz neki egy tömböt a képek url címével, egy callback-ot onload, és onerror-ra.
- Konstruktorban végigmész a tömbön: majd
new Image();
, majd bepakolod egy tömmbe, pl.:this.buffer.push
-t használva.- Minden képhez beállítasz egy
onload
, és egyonerror
callback-ot. Ha betöltődött egy kép az onload-ban megnézed hogy van é még letöltés alatt kép, ezt egy sima számlálóval megoldod, az onerror-t rádbízom, ha a képek betöltődtek a konstruktornak átadott callback-ot meghívod úgy, hogy átadod neki a buffert, majd innen mész tovább.Az ImageLoader
index.html
ImageLoader.js