Avatar billede pingo Nybegynder
21. juli 1999 - 14:57 Der er 20 kommentarer og
1 løsning

While loop i Netscape.

Hejsa.

Som de fleste nok ved kan man i Netscape ikke få fat i lag der ligger i andre lag ved at kalde deres navn direkte, men man er nødt til at kalde document.layername.layername.layername.

Jeg er dermed igang med at lave en funktion der skal kunne få fat i alle lag - uanset hvor mange der er - et uendeligt loop.

funktionen ser således ud:

function ShowAll(startlayer)
{
    for (i = 0; i < startlayer.layers.length; i++)
    {     
        currentLayer = startlayer.layers[i];
        currentLayer.visibility = "show";
        ShowAll(startlayer.layers.layers[i])
    }
}

Problemet er at det fungerer ikke - for når funktionen køres anden gang - inde fra sig selv bliver den gamle i variabel overskrevet, og den bliver ved med at loope med 1 i stedet for at tælle op som den skulle.

Er der nogen der kan figure out løsningen på det problem - så er der points at hente!
Avatar billede jumper Nybegynder
21. juli 1999 - 15:16 #1
Du skal flytte

ShowAll(startlayer.layers.layers[i])

udenfor for-løkken.

dvs:

function ShowAll(startlayer)
{
    for (i = 0; i < startlayer.layers.length; i++)
    {     
        currentLayer = startlayer.layers[i];
        currentLayer.visibility = "show";
    }
    ShowAll(startlayer.layers.layers[i])
}

/Thor
Avatar billede justincase Nybegynder
21. juli 1999 - 15:26 #2
Faktisk er det et meget større problem end som så. Det du foreslår jumper vel kun vise det første layers nestede layers, derefter alle af det sidste nestede layers layer og derefter det sidste nestede nested layes layer osv.

Det du savner er noget der miner om en directory parser. Og det er straks værre.

:)

JustinCase
Avatar billede justincase Nybegynder
21. juli 1999 - 15:31 #3
Hvis det hjælper kan du sætte alle de nestede layers visibility proporty til inherit, så vil de følge det første layers hide/show.
Avatar billede pingo Nybegynder
21. juli 1999 - 15:40 #4
Jumper er du dum eller hva'???

Så kig dog for helvede på hvad du svarer!
Avatar billede pingo Nybegynder
21. juli 1999 - 15:42 #5
juntincase: specificer nærmere - det sidste - det kan evt. bruges - pointne er dine hvis det kan!
Avatar billede jumper Nybegynder
21. juli 1999 - 15:57 #6
pingo slap dog af, jeg er lige stået op ;)

justincase's forslag handler om at dine nestede layers, og deres nestede layers, får visibility sat til 'inherit' istedet for 'hide' eller 'show'

Når du så ændrer på et layers synlighed, vil alle dets underlayers få samme synlighed. Dvs, show eller hide.

Dermed behøves du kun ændre på det første lag af layers, f.eks.:

function ShowAll(x)
for (i = 0; i < document.layers.length; i++){
  document.layers[i].visibility = x;
}


Så kalder du bare funktionen ShowAll() med parameteren x, der enten sættes til show eller hide. F.eks. ShowAll("show") for at vise alle layers.

/Thor
Avatar billede jumper Nybegynder
21. juli 1999 - 15:58 #7
Der skal lige et ekstra } efter for funktionen´!

sorry, jeg er morgentræt ;)

/Thor
Avatar billede jumper Nybegynder
21. juli 1999 - 16:01 #8
hovsa, funktionen skal rettes til:

function ShowAll(x){
for (i = 0; i < document.layers.length; i++){
  document.layers[i].visibility = x;
}
}

Jeg havde glemt { og } til funktionen ;)

/Thor
Avatar billede justincase Nybegynder
21. juli 1999 - 16:05 #9
Her er et script som skulle virke :

var lArray= new Array();
var lCount = 1;

function ShowAll(startlayer)
{
  l2Count = 0;
  while (l2Count < startlayer.layers.length)
  {     
    currentLayer = lArray[lCount].layers[l2Count];
    currentLayer.visibility = "show";
    lArray[lArray.length] = currentLayer;
    l2Count++;
  }
  lCount ++;
  if (lCount < lArray.length) {
    ShowAll(lArray[lCount])
  }
}

function start(lay) {
  lArray[1] = lay;
  ShowAll(lArray[1]);
  // Reset Array
  lArray.length = 0;
}


Fordelen ved at bruge det er at man har lidt mere konrtol over layerne. Hvis du f.eks har halvdelen af layerne visible og den anden halvdel hidden, så kan du swappe. eller hvad man nu kan finde på.

:)

JustinCase
Avatar billede justincase Nybegynder
21. juli 1999 - 16:30 #10
Med en rettelse til funktionen start :

function start(lay) {
  lArray.length= 0;
  lCount = 1;
  lArray[1] = lay;
  ShowAll(lArray[1]);
}
Avatar billede cyberesben Nybegynder
21. juli 1999 - 16:48 #11
jumper hvorfor står du op så sent? du sagde i går at du var nødt til at gå fordi du skulle besøge nogen
Avatar billede cyberesben Nybegynder
21. juli 1999 - 16:49 #12
altså besøge nogen i dag, så du ikke havde tid til at være på nettet i går fordi du skulle sove
Avatar billede jumper Nybegynder
21. juli 1999 - 17:49 #13
ja, men mine planer blev ændret. Hun besøgte mig i går aftes istedet for at jeg besøgte hende i dag ;)

pingo, har nogen af os svaret rigtigt eller hvad?

/Thor

Avatar billede pingo Nybegynder
22. juli 1999 - 08:18 #14
Jumper: beklager - jeg var lidt negativ - er bare træt af folk der bare svarer for at svare på eksperten! - og ja - justincase's svar med hans script virkede - cool nok!

justincase: skriv et eller andet som et svar - så du får pointsne...

Avatar billede pingo Nybegynder
22. juli 1999 - 09:09 #15
juntincase: nu er eneste problem bare at den kører lagene igennem i forkert rækkefølge.

Jeg vil gerne have den til at køre dem igennem så først et lag, og dets underlag, og dets underlag, og så først derefter at køre videre til næste lag i sit eget level. Dette er et Arrange spørgsmål - som kommer når lagene skal placeres.

Mvh

Brian Binnerup
Avatar billede justincase Nybegynder
22. juli 1999 - 12:00 #16
Det havde jeg slet ikke lagt mærker til. Det er da lidt underligt at den kører dem igennem bagfra.
Nå, men det kan sagtens rettes :

function ShowAll(startlayer)
{
  l2Count = startlayer.layers.length-1;
  while (l2Count >= 0)
  {     
    currentLayer = lArray[lCount].layers[l2Count];
    if (currentLayer.visibility == "show") {
      currentLayer.visibility = "hide";
    }
    else {
      currentLayer.visibility = "show";
    }
    lArray[lArray.length] = currentLayer;
    l2Count--;
  }
  lCount ++;
  if (lCount < lArray.length) {
    ShowAll(lArray[lCount])
  }
}

Her har jeg også lige lagt visibility inverteringen ind :)

JustinCase
Avatar billede pingo Nybegynder
22. juli 1999 - 12:20 #17
Jeg accepterer - men det var nu ikke det jeg mente.

Jeg har en Arrange funktion der kører alle lagene igennem (i Netscape) og sætter posY til det den nu skal være - så de ikke ligger oven i hinanden.

Problemet er at så kommer et underlag til x ikke til at ligge under x - men nederst.

Get it?
Avatar billede justincase Nybegynder
22. juli 1999 - 12:42 #18
Nej jeg er ikke helt sikker på hvad du mener. Kan du poste koden, eller har du en side jeg kan kigge på.

Som scriptet er nu så
tar den første layers under layers. Dem kan du så arrangere, så de ikke overlapper.
Derefter tar den første underlayer's første under layers, derefter det andet.

Det burde da være muligt at arrangere layerne ud fra scriptet.

Men det er lidt svært at teoretisere over uden noget kode at kigge på.
Avatar billede pingo Nybegynder
26. juli 1999 - 09:44 #19
Som scriptet er nu - så tager den første layers - kører dem igennem, tager derefter tager den første lags underlayers - derefter andet lags underlayer - osv.

Jeg vil gerne have den til at tage det første lag yderst - og lade den tage alle underlayers så langt ned de findes - og først derefter fortsætte til lag nr. 2 yderst.

Det er tiltænkt multiple outlines - som skal funge i netscape.

Den Arrange funktion der findes ser sådan ud - og er tiltænkt til at lave 10 pixels mellemrum mellem hvert lag - og start med at forestil dig at det hele skal vises på skærmen i den rigtige rækkefølge - jeg har skrevet lidt om i den så man bare starter den med Arrange() - og så starter den automatiskk fra document.

function Arrange(startlayer)
{
    if (startlayer == null)
    {
        nextY = 0;
        layerArray.length = 0;
        layerCount = 1;
        layerArray[1] = document;
        Arrange(layerArray[1]);
    }
    else
    {
        var currentCount = 0;
   
        while (currentCount < startlayer.layers.length)
        {
            currentLayer = layerArray[layerCount].layers[currentCount];
            if (currentLayer.visibility != "hide")
            {
                alert(nextY)
                currentLayer.pageY = nextY;
                nextY += currentLayer.document.height + 10;
            }
            layerArray[layerArray.length] = currentLayer;
            currentCount++;
        }
        layerCount ++;
   
        if (layerCount < layerArray.length)
        {
            Arrange(layerArray[layerCount])
        }
    }
}

Er du med nu?

PS. Der er lige et par point til dig hvis det er!

Avatar billede justincase Nybegynder
26. juli 1999 - 13:50 #20
Jeg vil godt tage en omgang til med det, men det bliver nok først imorgen. Jeg har overskredet en deadline og sidder og sveder koldsved for at overholde den. Min ferie startede idag, principielt, så arbejdet skal overstås først.

Nu hvor vi går så tæt på det der egenlig sker, kan du så ikke ligge en link, eller evt. sende den til mig : elvers@rossing.dk
Avatar billede pingo Nybegynder
27. juli 1999 - 08:47 #21
Desværre har jeg ikke de store mail-muligheder - vores server har et problem der først bliver lavet i løbet af ugen....

Men kan vi ikke bare tage den her?
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