Avatar billede lifeenergy Nybegynder
05. september 2008 - 17:39 Der er 24 kommentarer og
2 løsninger

funktion Zoom() stopper hvis den bliver kaldt igen ved andet elm.

Hej,

Nedenstående virker fint med én knap, men med 2 knapper virker det ikke helt efter ønske.

Funktionen zoomer ind på knappen indtil hMax er nået, eller onmouseout er kaldt, hvorefter den zoomer ud igen.

Der opstår et problem, hvis onmouseover bliver kaldt på en anden knap inden den er færdig med at zoome ud på den forrige. Den forrige stopper med at zoome ud. Jeg vil gerne have den til at fortsætte indtil den når hMin, selvom den anden knap er begyndt at zoome ind.

mvh
Lifeenergy


<?xml version="1.0" encoding="iso-8859-1"?>
<!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" xml:lang="da">
<head>
<title>menuzoom</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script type="text/javascript">
var style, ZoomedIn=false, ZoomedOut=false, timer, d=document;

var wMax=140;
var hMax=28
var wMin=110;
var hMin=22;

var speed = 40;        // hvor hurtigt skal den zoome - jo mindre tal jo hurtigere?
var step = 1;

var imgratio = wMin/hMin;


function Zoom(ZoomIt,id){
if(d.getElementById) style = d.getElementById(id).style;
else if (d.all) style = d.all[id].style;

  if ((ZoomedOut && ZoomIt) || (ZoomedIn && !ZoomIt)){
    clearTimeout(timer);
    if (ZoomedOut)ZoomedOut=false;
    else ZoomedIn=false;
    }
  if (style){
    var w = parseInt(style.width);
    var h = parseInt(style.height);
    var l = parseInt(style.left);
    var t = parseInt(style.top);   
    if (ZoomIt){
        if (h < hMax){
            w += Math.floor(step * imgratio);
            h += step;
            l -= Math.floor((step * imgratio) / 2);
            t -= Math.floor(step /2);
            ZoomedIn=true;
        }
    }           
    else {
        if (h > hMin){
            w -= Math.floor(step * imgratio);
            h -= step;
            l += Math.floor((step * imgratio) / 2);
            t += Math.floor(step /2);
              ZoomedOut=true;
          }
    }       
    style.width= w +'px';
    style.height= h +'px';
    style.left= l +'px';
    style.top= t +'px';
    timer = setTimeout('Zoom('+ZoomIt+',\''+id+'\')',speed);

    }
  }

</script>

</head>

<body>

<img id="img1" src="knap.png" style="width: 110px; height: 22px; position: absolute; top: 250px; left: 500px;"  onmouseover="Zoom(true,this.id);" onmouseout="Zoom(false,this.id);" />
<img id="img2" src="knap.png" style="width: 110px; height: 22px; position: absolute; top: 250px; left: 620px;"  onmouseover="Zoom(true,this.id);" onmouseout="Zoom(false,this.id);" />

</body>
</html>
Avatar billede lifeenergy Nybegynder
05. september 2008 - 17:56 #1
Jeg kan se der er et problem med timer, da den bliver ved med at kører selvom den er nået hMax el. hMin, så den burde flyttes ind i scriptet til h < hMax h > hMin. Men det er lidt svært lige at se, hvad der så skal ske.

function Zoom(ZoomIt,id){
if(d.getElementById) style = d.getElementById(id).style;
else if (d.all) style = d.all[id].style;

  if ((ZoomedOut && ZoomIt) || (ZoomedIn && !ZoomIt)){
    clearTimeout(timer);
    if (ZoomedOut)ZoomedOut=false;
    else ZoomedIn=false;
    }
  if (style){
    var w = parseInt(style.width);
    var h = parseInt(style.height);
    var l = parseInt(style.left);
    var t = parseInt(style.top);   
    if (ZoomIt){
        if (h < hMax){
            w += Math.floor(step * imgratio);
            h += step;
            l -= Math.floor((step * imgratio) / 2);
            t -= Math.floor(step /2);
            timer = setTimeout('Zoom('+ZoomIt+',\''+id+'\')',speed);       
            ZoomedIn=true;
        }
    }           
    else {
        if (h > hMin){
            w -= Math.floor(step * imgratio);
            h -= step;
            l += Math.floor((step * imgratio) / 2);
            t += Math.floor(step /2);
            timer = setTimeout('Zoom('+ZoomIt+',\''+id+'\')',speed);
              ZoomedOut=true;
          }
    }       
    style.width= w +'px';
    style.height= h +'px';
    style.left= l +'px';
    style.top= t +'px';


    }
  }
Avatar billede roenving Novice
05. september 2008 - 23:53 #2
Tjah, den er jo kun lavet til at understøtte eet element, så den skal nok programmeres om fra bunden, en objektorienteret tilgang kunne tænkes at være det rigtige ...
Avatar billede lifeenergy Nybegynder
06. september 2008 - 13:22 #3
Hvad tænker du på når du skriver "objektorienteret tilgang". Findes der nogle steder på nettet, hvor jeg kan læse om det. Kan du give et lille eksempel.
Avatar billede roenving Novice
06. september 2008 - 21:17 #4
Hvis du googler oop eller slår det op på http://da.wikipedia.org, kan du få nogle ideer ...

-- men da jeg selv skulle lave en fade-ting, som skulle virke på flere objekter samtidig for nogle år siden valgte jeg at bruge en ret flad objekt-tilgang, nemlig arrays: http://roenving.users.whitehat.dk/WD5Opacity.html !-)
Avatar billede lifeenergy Nybegynder
10. september 2008 - 13:31 #5
Hvad skal jeg søge efter?
Avatar billede roenving Novice
11. september 2008 - 23:24 #6
Den tilgang, jeg bruger, sløser en anelse mere med hukommelses- og processor-ressourcerne, men er alligevel ganske effektiv i de udgaver, jeg har prøvet (relativt få objekter !-)

-- og årsagen er, at hvis du får brug for et forsinket kald ved brug af setTimeout eller setInterval, vil objektet ikke være tilstede på det forsinkede kalds kalde-tidspunkt, og det kan være lidt kompliceret at oprette et objekt, så dette kan forebygges, det er lidt simplere at løbe et array igennem og teste, at vi nu har fat i det lige præcist rigtige ...

-- og faktisk kan du søge på javascript for at få en ide: http://da.wikipedia.org/wiki/Javascript !-)

-- ellers googler du bare oop, og kigger efter konkrete kodeeksempler, dem er der i hvert fald nogle millioner af !o]
Avatar billede roenving Novice
11. september 2008 - 23:31 #7
Uhh, Mike Koss' artikel ser god ud, jeg har dog ikke læst den rigtigt, så jeg vil gætte på, at den som stort set alle andre artikler på indernettet, indeholder nogle fejl og mangler, måske væsentlige misforståelser eller forældede måder at benytte sig af DOM eller andet, der kan give nogle misopfattelser, men den kan du da prøve: http://mckoss.com/jscript/object.htm !-)
Avatar billede lifeenergy Nybegynder
13. september 2008 - 12:05 #8
Hej,

Jeg har set dit script. Det ser spændende ud, med det script.
Og tak for tipsene, så kan jeg få lidt inspiration.
Avatar billede lifeenergy Nybegynder
13. september 2008 - 14:59 #9
Det ser ud til at OpC.length forrøges hver gang man fører musen hen over billedet. - Så den laver et nyt array hver gang.(?)
Avatar billede roenving Novice
13. september 2008 - 15:19 #10
Hrm, du har ret, men de nye array-elementer bliver ikke brugt (og fyldt !-)

-- men den må jeg lige finde forklaringen på,
Avatar billede roenving Novice
13. september 2008 - 15:20 #11
-- fortsat

for det holder jo ikke med den slags evighedsmaskiner, der æder computerens ressourcer !-)
Avatar billede lifeenergy Nybegynder
13. september 2008 - 15:28 #12
Ja:)
Avatar billede lifeenergy Nybegynder
13. september 2008 - 16:12 #13
Det ser ud af at det er denne OpC[idx] = new Array(); i løkken der giver problemet.
Den bliver ved med at oprette et nyt array i løkken, som jeg har udkommenteret:

for(var i=0;idx>i;i++){
            if(OpC[i][0]==elm){ 
          clearInterval(OpC[i][4]);
            idx = i;
            break;
        }
        // OpC[idx] = new Array();
    }
Hvis man så istedet placerer denne længere nede. Så forrøges OpC.length ikke længere efter den har indekseret alle elementer.
Avatar billede roenving Novice
13. september 2008 - 16:20 #14
Jepz, den har jeg også registreret, det mærkelige er, at den ikke laver noget, hvis det er det første element ...
Avatar billede lifeenergy Nybegynder
13. september 2008 - 16:26 #15
Hvis det er første element er længden OpC.length 0, så kører den ikke løkken igennem, da i og idx er ens.

Hvis man så ændrer
if(idx==0)

til
if(idx==i)OpC[idx] = new Array(); // Hvis den enten ikke søger igennem, da der ikke er nogle arrays (første gang) eller den er søgt igennem, da søgningen stopper når i== idx

og skriver nederst window.status = OpC.length;
Så starter den med at tælle op indtil den indeholder samtlige elementer. Derefter tæller den ikke op længere.
Avatar billede lifeenergy Nybegynder
13. september 2008 - 16:47 #16
Det virker, men så er det lige det at den jo alligevel sætter idx til at være lig med i  i løkken, hvis den finder array'et og stopper.
Avatar billede lifeenergy Nybegynder
13. september 2008 - 17:06 #17
nej... efter løkken er kørt igennem er i ikke lig med idx, da den stopper inden.
Men man kan sætte en variabel ind i løkken, found=true og på denne måde undersøge om den har fundet det eksisterende array. Det virker.
Avatar billede lifeenergy Nybegynder
13. september 2008 - 17:15 #18
Jeg skrev:
>> efter løkken er kørt igennem er i ikke lig med idx, da den stopper inden
idet der står "for(var i=0;idx>i;i++){".

...Dog bliver idx sat til i, hvis den finder array'et:)
Avatar billede lifeenergy Nybegynder
14. september 2008 - 11:44 #19
ie = !!elm.filters;
  moz = elm.style.MozOpacity != undefined;
  css3 = elm.style.opacity != undefined;
  found = false;
 
  if (!ie && !moz && !css3)return;   
  var idx = OpC.length;

    for(var i=0;idx>i;i++){
        if(OpC[i][0]==elm){ 
            clearInterval(OpC[i][4]);
            found=true;
            idx = i;
            break;
        }
    }
    if(!found)OpC[idx] = new Array();
Avatar billede lifeenergy Nybegynder
18. september 2008 - 15:23 #20
Du kan godt se hvad jeg mener?
Hvis du vil have nogle point så læg et svar.
Avatar billede roenving Novice
19. september 2008 - 10:42 #21
Jepz !-)

-- nu var der jo lige lidt ting du var grundigt inde over selv, så måske det skulle være en deler ?-)

Velbekomme '-)
Avatar billede lifeenergy Nybegynder
19. september 2008 - 12:28 #22
OK:)
Avatar billede lifeenergy Nybegynder
19. september 2008 - 12:29 #23
Man kan vist både bruge if(idx==i) og if(!found) til at løse problemet:)
Avatar billede roenving Novice
19. september 2008 - 12:35 #24
Tak for point og din undersøgelse !-)
Avatar billede lifeenergy Nybegynder
19. september 2008 - 12:50 #25
Selv tak - altid rart med lidt sparing:)
Avatar billede lifeenergy Nybegynder
19. september 2008 - 15:46 #26
Jeg var lige inde og kigge på scriptet igen. Jeg skrev noget ikke helt korrekt. idx bliver sat til i i løkken hvis den bliver fundet i array. Derfor er i lig med idx hvis den er fundet eller når det starter (OpC.length er lig 0). Derfor kan if(idx==i) ikke bruges. Men den anden. Den er lidt kompliceret:)
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