Preloaden verbetering?
Yoo,
Ik ben bezig een pagina te maken waarbij er snel door verschillende afbeeldingen gebladerd moet kunnen worden.
Omdat de nadruk op 'snel' ligt, heb ik het volgende gedaan, (nou ja, het is eigenlijk iets uitgebreider maar dit is het princype, in het origineel zitten nog een aantal controles)
Goed, dit werkt prachtig, kom je op de website dan issie nog een tikkie traag maar als het eenmaal geladen is kan je heerlijk snel door de afbeeldingen bladeren. De afbeelding zit in een link zodat het nog steeds werkt als javascript niet toegankelijk is (maar dan trager)
Dus wat is nu eigenlijk het probleem? De pagina moet ook goed werken op een mobieltje, dat doet het matig, omdat het aardig wat afbeeldingen zijn het kunnen er 20 zijn maar ook 40, en de afbeeldingen een aardig formaat hebben, duurt het eerste bezoek aan de pagina nogal lang, klik je op de link voordat de pagina geladen is dan ontstaat er een fout en treed de a href in werking,
Wat mij doet denken... is er geen betere manier om afbeeldingen te preloaden dat ook werkt op een mobiel? (had gedacht over iframes maar die werken niet op alle mobieltjes, or so i heard)
Ik ben bezig een pagina te maken waarbij er snel door verschillende afbeeldingen gebladerd moet kunnen worden.
Omdat de nadruk op 'snel' ligt, heb ik het volgende gedaan, (nou ja, het is eigenlijk iets uitgebreider maar dit is het princype, in het origineel zitten nog een aantal controles)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- in de head -->
<script>
var key = 0;
var test = new Array;
for(var i = 0; i < 20; i ++){
test[i] = new Image;
test[i].src = "images/image_" + i + ".jpg";
}
function next(){
key ++;
document.getElementById('image').src = test[key].src;
}
function last(){
key --;
document.getElementById('image').src = test[key].src;
}
</script>
<!-- in de body-->
<input type="button" onclick="next();" value="Next">
<input type="button" onclick="last();" value="Last">
<a href="http://site.nl/pagina/images/1/" onclick="next(); return false;"><img id="image" src="images/image_0.jpg" alt="image" /></a>
<script>
var key = 0;
var test = new Array;
for(var i = 0; i < 20; i ++){
test[i] = new Image;
test[i].src = "images/image_" + i + ".jpg";
}
function next(){
key ++;
document.getElementById('image').src = test[key].src;
}
function last(){
key --;
document.getElementById('image').src = test[key].src;
}
</script>
<!-- in de body-->
<input type="button" onclick="next();" value="Next">
<input type="button" onclick="last();" value="Last">
<a href="http://site.nl/pagina/images/1/" onclick="next(); return false;"><img id="image" src="images/image_0.jpg" alt="image" /></a>
Goed, dit werkt prachtig, kom je op de website dan issie nog een tikkie traag maar als het eenmaal geladen is kan je heerlijk snel door de afbeeldingen bladeren. De afbeelding zit in een link zodat het nog steeds werkt als javascript niet toegankelijk is (maar dan trager)
Dus wat is nu eigenlijk het probleem? De pagina moet ook goed werken op een mobieltje, dat doet het matig, omdat het aardig wat afbeeldingen zijn het kunnen er 20 zijn maar ook 40, en de afbeeldingen een aardig formaat hebben, duurt het eerste bezoek aan de pagina nogal lang, klik je op de link voordat de pagina geladen is dan ontstaat er een fout en treed de a href in werking,
Wat mij doet denken... is er geen betere manier om afbeeldingen te preloaden dat ook werkt op een mobiel? (had gedacht over iframes maar die werken niet op alle mobieltjes, or so i heard)
Je kan pas bij window.onload de foto's laden. Wanneer mensen een andere foto willen hebben dan tot dan toe geladen is, moet je dat even handmatig doen. Let wel op dat dit mobiele gebruikers veel data kost.
Hij begint meteen met het ophalen van de afbeeldingen, de image.src kan inderdaad pas veranderd worden als alles geladen is, daarom heeft het ook een 'default' src.
Dat dit nogal zwaar is voor mobieltjes is de reden dat ik een betere preloading manier zoek, ik vind het niet erg dat dit veel data kost maar wel dat de gebruiker redelijk lang moet wachten voordat hij door kan klikken.
Dat dit nogal zwaar is voor mobieltjes is de reden dat ik een betere preloading manier zoek, ik vind het niet erg dat dit veel data kost maar wel dat de gebruiker redelijk lang moet wachten voordat hij door kan klikken.
Ik vind preloaden irritant. Als je op iedere pagina's "Even geduld" ziet , dan klikken er véél weg
Ja ik klik ook altijd weg als ik mijn gmail mail wil bekijken ;).
Maar het hele idee van preloading is toch dat je het onopgemerkt doet?
Maar het hele idee van preloading is toch dat je het onopgemerkt doet?
Als je die array pas gaat opbouwen na onload, hoeft het laden van de pagina niet meer samen te gaan met het laden van de plaatjes.
Eventueel kan je nog handmatig beslissen hoeveel plaatjes je tegelijk wilt preloaden door er maar een paar per keer aan de array toe te voegen. Via image.onload kan je horen wanneer hij geladen is (en onerror wanneer dat mislukt)
Eventueel kan je nog handmatig beslissen hoeveel plaatjes je tegelijk wilt preloaden door er maar een paar per keer aan de array toe te voegen. Via image.onload kan je horen wanneer hij geladen is (en onerror wanneer dat mislukt)
Voor mobiele bezoekers een aparte website maken waar de afbeeldingen een stuk kleiner zijn.
Op het moment heb ik een kleine tekst (in het origineel) dat vraagt om geduld, zeker niet groot en zeker niet in de weg, en al helemaal geen grote filler met 'even geduld aub' ;) Dit omdat de de javascript return false niet werkt als de pagina wel zichtbaar is maar de afbeeldingen niet geladen zijn. Voor de rest is het inderdaad de bedoeling dat de gebruiker niks van het preloaden ziet (behalve het resultaat ervan natuurlijk)
@Oetzie, De afbeeldingen bevatten teksten, kleiner maken heeft betekend dat ze moeten inzoemen en daarmee gaat de kwaliteit naar beneden, al met al dus een slechte oplossing. De kwaliteit naar beneden gooien is ook geen oplossing helaas.
@Jelmer, dat kan best eens een goeie oplossing zijn, maar als de gebruiker dan naar de volgende gaat voordat het script de src in de volgende key gezet heeft?
Zou het anders niet handiger zijn als de onload van de eerste afbeelding het preloaden van de volgende afbeelding in gang zet, en die onload weer van de volgend, enz?
@Oetzie, De afbeeldingen bevatten teksten, kleiner maken heeft betekend dat ze moeten inzoemen en daarmee gaat de kwaliteit naar beneden, al met al dus een slechte oplossing. De kwaliteit naar beneden gooien is ook geen oplossing helaas.
@Jelmer, dat kan best eens een goeie oplossing zijn, maar als de gebruiker dan naar de volgende gaat voordat het script de src in de volgende key gezet heeft?
Zou het anders niet handiger zijn als de onload van de eerste afbeelding het preloaden van de volgende afbeelding in gang zet, en die onload weer van de volgend, enz?
Gewijzigd op 18/08/2010 12:18:37 door Johan Dam
ik moet een dergelijk iets gaan schrijven voor een foto-gallery achtige omgeving ( maatwerk voor fotograaf ).
De oplossing die voor mij tot nu toe het beste uit de bus kwam is schematisch:
<ul>
<li><img src="img1.png" id="img1" /></li>
<li><img src="img2.png" id="img2" /></li>
<li><img src="img3.png" id="img3" /></li>
<li><img src="blank.gif" id="img4" /></li>
<li><img src="blank.png" id="img5" /></li>
</ul>
De eerste 3 afbeeldingen worden standaard geladen ( 3 foto's is mijn "view-scope" ahw ).
Zodra de 2e foto getoond wordt aan de gebruiker, worden vanaf: <huidige foto +1>, 3 foto's geladen ( preload ).
blank.gif is een transparante gif overigens.
De oplossing die voor mij tot nu toe het beste uit de bus kwam is schematisch:
<ul>
<li><img src="img1.png" id="img1" /></li>
<li><img src="img2.png" id="img2" /></li>
<li><img src="img3.png" id="img3" /></li>
<li><img src="blank.gif" id="img4" /></li>
<li><img src="blank.png" id="img5" /></li>
</ul>
De eerste 3 afbeeldingen worden standaard geladen ( 3 foto's is mijn "view-scope" ahw ).
Zodra de 2e foto getoond wordt aan de gebruiker, worden vanaf: <huidige foto +1>, 3 foto's geladen ( preload ).
blank.gif is een transparante gif overigens.
Daar heb je het document toch niet voor nodig? Je kan ze toch in een DOM stukje in javascript laden?
@Johan, nee ik zou iets van 5 of meer afbeeldingen eerder en later laden. Een mens kan vrij snel scrollen, maar afbeeldingen laden duurt langer.
En waarom maak je niet van:
Dat moet toch ook werken?
@Johan, nee ik zou iets van 5 of meer afbeeldingen eerder en later laden. Een mens kan vrij snel scrollen, maar afbeeldingen laden duurt langer.
En waarom maak je niet van:
Dat moet toch ook werken?
Gewijzigd op 18/08/2010 14:57:45 door Pim -
@Pim, zou maar zo kunnen, begin pas recentelijk een beetje handig met javascript te worden.
Maar het lijkt me echter niet zo uitmaken voor performance?
Maar het lijkt me echter niet zo uitmaken voor performance?
Geen idee ;)
Misschien een klein beetje voor- of nadeel.
Misschien een klein beetje voor- of nadeel.
Je kan aan de return-value van een functie toch niet direct iets toewijzen? ;)
Image is inderdaad wel een DOMNode volgens mij, dus je zou hem met appendChild of replaceChild in dit geval kunnen gebruiken. Maar je bent dan wel meteen alle andere attributen die al aan het bestaande plaatje waren toegewezen kwijt.
Image is inderdaad wel een DOMNode volgens mij, dus je zou hem met appendChild of replaceChild in dit geval kunnen gebruiken. Maar je bent dan wel meteen alle andere attributen die al aan het bestaande plaatje waren toegewezen kwijt.
Dat is op zich niet zo erg, de afbeeldingen hebben verschillende afmetingen, de enige attribute die belangrijk is is de id natuurlijk,
De afbeelding-urls komen uit de db, dus met php, de return values kunnen dus best wel 'toegewezen' worden ;)
Denk niet dat het handig is om met de DOM te klooien, de huidige opzet werkt in princype prima, het probleem ligt bij hoe de afbeeldingen geladen worden. Of ik moet een voordeel van de DOM missen?
Toevoeging op 19/08/2010 08:52:30:
@Pim, even uitgetest en krijg de foutmelding 'invalid assignment left-hand side' dus nee, geloof dat ht toch echt via de src zal moeten ;)
@Jelmer, bedankt voor de onload tip, dat werkt prima!
Hoewel het laden natuurlijk even lang duurt als voorheen, merk je er nu veel minder van. (Voorheen moest je wachten voordat de next() functie werkte, waarschijnlijk omdat de volgende key nog niet bestond of de javascript bleef wachten op de afbeelding oid) nu kan je rustig bladeren en word alles ondertussen geladen, enige wat je ziet is dat de browser een beetje lang blijft 'laden' ookal is de site (voor zover de gebruiker kan zien) gewoon bruikbaar.
Ik heb nu ongeveer dit:
De afbeelding-urls komen uit de db, dus met php, de return values kunnen dus best wel 'toegewezen' worden ;)
Denk niet dat het handig is om met de DOM te klooien, de huidige opzet werkt in princype prima, het probleem ligt bij hoe de afbeeldingen geladen worden. Of ik moet een voordeel van de DOM missen?
Toevoeging op 19/08/2010 08:52:30:
@Pim, even uitgetest en krijg de foutmelding 'invalid assignment left-hand side' dus nee, geloof dat ht toch echt via de src zal moeten ;)
@Jelmer, bedankt voor de onload tip, dat werkt prima!
Hoewel het laden natuurlijk even lang duurt als voorheen, merk je er nu veel minder van. (Voorheen moest je wachten voordat de next() functie werkte, waarschijnlijk omdat de volgende key nog niet bestond of de javascript bleef wachten op de afbeelding oid) nu kan je rustig bladeren en word alles ondertussen geladen, enige wat je ziet is dat de browser een beetje lang blijft 'laden' ookal is de site (voor zover de gebruiker kan zien) gewoon bruikbaar.
Ik heb nu ongeveer dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var key = 0;
var test = new Array;
for(var i = 0; i < 20; i ++){
test[i] = new Image;
}
window.onload = function(){
for(var i = 0; i < 20; i ++){
test[i].src = "images/image_" + i + ".jpg";
}
}
function next(){
key ++;
document.getElementById('image').src = test[key].src;
}
function last(){
key --;
document.getElementById('image').src = test[key].src;
}
var test = new Array;
for(var i = 0; i < 20; i ++){
test[i] = new Image;
}
window.onload = function(){
for(var i = 0; i < 20; i ++){
test[i].src = "images/image_" + i + ".jpg";
}
}
function next(){
key ++;
document.getElementById('image').src = test[key].src;
}
function last(){
key --;
document.getElementById('image').src = test[key].src;
}
Gewijzigd op 19/08/2010 08:54:59 door Johan Dam




