Avatar billede sw_red_6 Nybegynder
29. juni 2009 - 11:48 Der er 22 kommentarer og
1 løsning

Hvordan kan man tjekke om billeder er loadede?

Jeg henter ca. 200 navne på billeder som skal sættes ind på en side.
Dette gøres dynamisk, men for at gøre hastigheden højere bliver der sat en række mindre (i kb) billeder ind som skal skiftes til versioner med højere opløsning, når alle billederne så er loadet.. men hvordan kan jeg tjekke at alle billederne er blevet hentet inden jeg kører den funktion som skifter billederne ud?
Avatar billede jokkejensen Novice
29. juni 2009 - 13:28 #1
Jeg ville bestemt ikke lade brugerne hente 400 billeder for at vise 200, så hellere lave det lidt asynkront, så den kun viser de billeder er der loaded, og et "loading" icon imens.
Avatar billede ebusiness Nybegynder
29. juni 2009 - 13:58 #2
Det bør du slet ikke bruge et script til, du kan nøjes med lowsrc: http://www.htmlcodetutorial.com/images/_IMG_LOWSRC.html
Avatar billede jokkejensen Novice
29. juni 2009 - 14:03 #3
omg...
Avatar billede majbom Novice
29. juni 2009 - 14:17 #4
-> #2 - kan du ikke henvise til en standard hvor den attribut indgår?
Avatar billede jokkejensen Novice
29. juni 2009 - 14:21 #5
ja, eller i det mindste hvad attributten gør.... og hvor kompatibel den er.
Avatar billede ebusiness Nybegynder
29. juni 2009 - 15:12 #6
Undskyld, det gik lidt for stærkt, men I behøver ikke at være sarkastiske, og kommentar #3 er direkte dum. I må meget gerne korrigere, men gør det ordentligt klart og tydeligt, for ellers er der ikke nogen som bruge jeres kommentarer til noget.

@sw_red_6 det var vist en gammel proprietær standard jeg fik hevet frem der. Du må ud i complete attributten, billedelement.complete returnerer true når billedet er hentet.

Om det er en god ide at hente lav opløsnings versioner kommer an på det specifikke tilfælde. Uanset hvor små billederne er vil der altid blive tilføjet fast mængde ekstra spildtid, så hvis du har en stak små billeder bliver siden muligvis slet ikke hurtigere af at at lave mindre versioner.

Til tider kan der være adskillige sekunder at spare ved at smække alle billederne sammen i et billede og så "skille dem ad" på siden ved at sætte det samlede billede ind som div baggrund med forskellig placering alt efter hvilket billede der ønskes vist.

Vis os din side, så kan jeg nok svare lidt mere konkret på hvad den bedste løsning er.
Avatar billede jokkejensen Novice
29. juni 2009 - 15:16 #7
complete attributten ? omg igen...
Avatar billede ebusiness Nybegynder
29. juni 2009 - 15:24 #8
Kom med et bedre svar eller ti stille.
Avatar billede majbom Novice
29. juni 2009 - 15:38 #9
SKAL der være 200 billeder på én side?
Avatar billede jokkejensen Novice
29. juni 2009 - 15:45 #10
.. jeg har givet et bud. og ti stille, er ikke noget der hører hjemme på et fora.

Det skal ikke løses med gammle obsolute attributter/events, men med moderne web2 teknologi. Som om du svarer i en 1990 netscape vs IE verden.... og derfor min fortvivlelse.

Et simpelt tænkt eksempel:

<div id="test">
<img src="/lowrez/1.jpg" />
<img src="/lowrez/2.jpg" />
.... flere billeder
</div>

/* IKKE TESTET */

window.onload = function()
{
var imgs = document.getElementById('test').getElements;
for(i=0; i < imgs.length;i++)
{
imgs[i].src = imgs[i].src.replace('lowrez', 'highrez');
}



Men jeg syntes nu stadig det er smartere asynkront at hente highrez billederne.

/J
}
Avatar billede jokkejensen Novice
29. juni 2009 - 15:46 #11
var imgs = document.getElementById('test').getElementsByTagName('IMG');

Selvfølgelig.....
Avatar billede ebusiness Nybegynder
29. juni 2009 - 16:14 #12
Ok, det var ihvertfald et svar, men vi skal vel egentlig også have indlæst de store billeder før udskiftningen. Vil du forsøge at gøre det uden brug af complete? Og hvordan?

Jeg vil vente med et endeligt svar til spørgsmålsstilleren har præciseret, specielt vil jeg gerne vide hvor store billederne er.
Avatar billede jokkejensen Novice
29. juni 2009 - 16:21 #13
{
var img = new img();
imgs[i].src = "updating to highrez.gif";
/*preloading........*/
img.src = imgs[i].src.replace('lowrez', 'highrez');
/*Done*/
imgs[i].src = img.src;

}

Det er jo ikke en køb software for fiktive points side det her, men konkrete spørgsmål der skal besvares eller folk skal have hjælp til noget konkret, så jeg har ikke tid til at svare på flere af dine spm.

Spørger er velkommen, du kan bare oprette et spørgsmål hvis du har yderligere ebusisness.

/J
Avatar billede sw_red_6 Nybegynder
30. juni 2009 - 13:55 #14
hmm skulle måske præcisere..
Jeg henter navnene med ajax/json og billederne skal vises på en side.
Problemet er at det tager for lang tid at loade alle billederne i deres oprindelige opløsning (min. 50KB pr. billede) så der er lavet en udgave med meget lavere opløsning (ca. 5KB pr. billede), disse billeder tager 1/10 af tiden at loade.
Når de 200 små billeder er loadet skal de skiftes ud med de store billeder.

@splazz: der skal kunne vises op til 200 billeder på siden.

@jokkejensen: Det kunne måske være at det skulle laves med noget asynkron hentning, men hvordan skulle det gøres? og hvordan kan jeg være sikker på at 'loading'-billedet bliver loadet før jeg begynder at skifte src på alle elementerne?
Det kan forresten ikke lade sig gøre at bruge window.onload eftersom elementerne bliver dynamisk oprettet efter siden er færdigloadet..

@ebusiness: Jeg kan ikke vise siden eftersom der er person-følsomme data på den. Desuden er billederne ikke noget som er/vil blive offentligt tilgængeligt.
Det kan heller ikke lade sig gøre at lave et stort billede da det er billeder der bliver oploadet af brugerne selv..
mht. complete - hvis du kan komme med et link så jeg kan se hvor i standarden den er, vil jeg bestemt overveje det...
Avatar billede jokkejensen Novice
30. juni 2009 - 14:37 #15
nej, det jeg ville var IKKE at præsentere de små billeder, men asynkront erstatte "loading.gif" med de store billeder.

Du har ret i at window.onload() afvikles når dom er indlæst og ikke alle billederne, herfra kan de forskellige browser opfatte det lidt forskelligt.

Men der er mange eksempler på samme, måske du kan bruge, jeg vil helst ikke til at udarbejde:

http://jqueryfordesigners.com/image-loading/
Avatar billede jokkejensen Novice
30. juni 2009 - 14:41 #16
mht til complete, hedder den i dag:

var img = new image
img.src = 'sti';
img.onLoad= function(){replace sti;}
Avatar billede ebusiness Nybegynder
30. juni 2009 - 18:21 #17
Jeg kan ikke lige finde noget der ligner en officiel standard noget sted som inkluderer complete, jeg kan heller ikke finde onload i forbindelse med img elementer. Men begge dele optræder i de facto standarden.

Hvilken standard bruger du jokkejensen? Jeg må indrømme, jeg kan ikke finde noget der ligner en komplet JavaScript standard som kan besvare spørgsmålet.
Avatar billede jokkejensen Novice
01. juli 2009 - 09:27 #18
Standard ? - ECMA-262, men den bruger alle vist når vi taler JS. Den længe ventede nye version kommer jo først til jul "the fifth edition". ECMA bliver så afviklet af forskelle "engines", og derfor vil du opleve at ikke alle metoder og objecter fungerer ens:

http://en.wikipedia.org/wiki/List_of_ECMAScript_engines


(derfor jeg altid bruger jquery, eller et andet lib der håndtere de forskellige browsere)

image objectet har en onload event.
Avatar billede jokkejensen Novice
01. juli 2009 - 09:29 #19
det er ikke et html img element, men et image object i JS.. du blander tingene sammen.
Avatar billede ebusiness Nybegynder
01. juli 2009 - 11:32 #20
Jeg har været igennem ECMA-262, og der står intet om DOM elementer og de tilhørende funktioner, ordet onload er ikke engang nævnt. Tilsyneladende er det kun en specifikation for basissproget.

Tjaa, new Image (det skal være med stort hvis der skal ske noget) er ikke nævnt i ECMA-262, så hvordan skulle jeg vide hvad det egentlig er for et objekt som opstår? Jeg kan blot konstatere at det tilsyneladende virker ligesom et DOM element, og kan indsættes i dokumentet som sådan.
Avatar billede jokkejensen Novice
01. juli 2009 - 12:37 #21
Alle objekter er ikke lige beskrevet deri, nej, men der findes et image object, her er et færdigt eksempel, jeg gider ikke mere i denne tråd:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Untitled Page</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.min.js" type="text/javascript"></script>
   
    <script type="text/javascript">
        $(document).ready(function()
        {       
            $('button').click(function()
            {
                    $('div').html("Forsøger at henter billede");
                    img = new Image();
                    img.src = $('input').val();
                    $('img').attr('src', img.src);
                    $('div').html("Henter");
                    $(img).load(function()
                    {
                        $('div').html("Færdig");
                    });
            });
                   
        });   
    </script>
</head>
<body>
    <input value="http://farm4.static.flickr.com/3574/3677412593_c833c435c7_o.jpg" type="text" />
    <div>Indtast url til billede</div>
    <button>Hent billede</button>
    <img src="" />   
</body>
</html>
Avatar billede jokkejensen Novice
01. juli 2009 - 12:41 #22
.. hans kode skal så bare sige:

<img class="loadhighrez" src="lowrez" />

$('img.loadhighrez').each
{
  //
}
Avatar billede sw_red_6 Nybegynder
13. august 2009 - 16:02 #23
Vi venter med at lave om på det indtil brugerne vender tilbage med en melding ang. hastigheden.

Jeg lukker spørgsmålet, hvis nogen af jer vil have point så kom med et svar..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester