Avatar billede repsac Nybegynder
04. januar 2003 - 22:47 Der er 63 kommentarer

Junglering med variable i JavsScript

Hej folkens,

Håber at JavaScript-folket lige vil se på følgende kode :)

- CODE -----------------------------------------------------------
<script type="Text/JavaScript">
var id;
function hit(id) {
    var open_id = "content_"+id;
    open_id.style.display='none'; //LINJE 5
    // Det er nok i ovenstående linje fejlen er, da det virker hvis jeg
    // skriver content_produkter.sty...
}
</script>

<div class="element" id="produkter" onClick="hit('produkter')">
<?php menupunkt("Produkter"); ?>
</div>
<div class="level1" id="content_produkter" style="display: ;">
  <div class="element" id="software">
  <?php menupunkt("Software"); ?>
  </div>
</div>
- /CODE ----------------------------------------------------------

Jeg ved godt hvor min kode er forkert (i linje 5 (i hvert fald)), men hvad er løsningen på problemet?

Behøver jeg forklare hvad jeg vil?

På forhånd tak for hjælpen!

/repsac
Avatar billede erikjacobsen Ekspert
04. januar 2003 - 23:01 #1
prøv

  eval(open_id+".style.display='none';"); //LINJE 5
Avatar billede jespernaur Nybegynder
04. januar 2003 - 23:05 #2
Eller spar en variable ved at skrive

    eval("content_"+id+".style.display='none';");
Avatar billede erikjacobsen Ekspert
04. januar 2003 - 23:07 #3
men uanset det virker vil jeg anbefale en getElementById ...
hvordan det nu end er den virker.
Avatar billede repsac Nybegynder
04. januar 2003 - 23:13 #4
Aha, det virker jo perfekt :)

Findes der nogen dokumentation af alskens forskellige funktioner, syntaks etc. til JavaScript? - Hvor?

Hvad er det getElementById? Nogen doc på hvordan det virker?
Avatar billede jespernaur Nybegynder
04. januar 2003 - 23:21 #5
Det er ikke den 'officielle' standard definition, men kast et blik:

http://codepunk.hardwar.org.uk/ajs29.htm
Avatar billede repsac Nybegynder
04. januar 2003 - 23:26 #6
Ahh, nu forstår jeg i hvert fald hvorfor det virker; tak!

Findes der ingen doc til JavaScript + en ordentlig søge-ting (i stil med php.net)?
Avatar billede repsac Nybegynder
04. januar 2003 - 23:28 #7
Det eneste jeg sådan lige kunne finde var følgende:
http://developer.netscape.com/docs/manuals/js/client/jsguide/index.html
Jeg synes bare ikke den er særlig god...
Avatar billede repsac Nybegynder
04. januar 2003 - 23:34 #8
http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/ og echoecho.com ser også du til at kunne bruges lidt, men...
Det er ikke rigtig godt :-/
Avatar billede erikjacobsen Ekspert
04. januar 2003 - 23:38 #9
JavaScript har udviklet sig lidt til at blive en kunst, ikke en
videnskab - med alle de browsere og versioner der nu findes.
Jeg kender ikke den ultimative tilgangsvinkel.
Avatar billede olebole Juniormester
04. januar 2003 - 23:47 #10
<ole>

eval() er en langsom funktion og helt overflødig, når det gælder at tilgå¨HTML-elementer. Brug i stedet:

  document.getElementById("content_"+id).style.display = "none";

Den officielle standard kan købes hos ECMA, der vedligeholder standarden for ECMA-script, som JavaScript nu om stunder er en implementering af. Om du får noget ud af at læse den, er dog ikke sikkert. Den er absolut ikke stillet op som NS's eller php.net's sider. Det kræver faktisk, man er rigtig godt hjemme i at læse specifikationer, at få noget ud af den. Er du det, er den til gengæld kanuuun  :)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
04. januar 2003 - 23:54 #11
Så er Ole vågnet - igen.

Eksemplet med eval er nu meget godt til at indse
hvilken fejl der blev begået.

Ole, hvad skal man med èn standard, når man nu har
alle disse forskellige brosere?
Avatar billede erikjacobsen Ekspert
04. januar 2003 - 23:55 #12
Jeg må se at få repareret min dobbelt-v tast
Avatar billede olebole Juniormester
04. januar 2003 - 23:55 #13
Erik >> JavaScript er stadig 'en videnskab'  ;o)

Problemet er blot, folk blander flere forskellige implementeringer (f.eks: JavaScript og MS' JScript) af ECMA-script sammen og tror, de skriver JavaScript.

Det gælder ikke dig ... I know  ;o)
/mvh
Avatar billede erikjacobsen Ekspert
05. januar 2003 - 00:00 #14
Kunsten kommer vel når man skal reparere fejlagtige implementeringer.
Avatar billede olebole Juniormester
05. januar 2003 - 00:03 #15
Erik >> Diversitet er en skøn ting ... gid der var endnu flere forskellige brusere.

Til gengæld kunne jeg godt undvære en enkelt fabrikant, hvis mål det er at eje WWW - og for hvem kvalitet og kompatibilitet aldrig har været et mål i sig selv  ;o)
/mvh
Avatar billede olebole Juniormester
05. januar 2003 - 00:03 #16
*LooOooL*  Netop ...!  :D
Avatar billede repsac Nybegynder
05. januar 2003 - 00:18 #17
*host* så er jeg "tilbage" :)

"Den officielle standard kan købes hos ECMA(...)" - jaaaeh (lidt smygende), jeg vil jo godt undgå at skulle købe sagerne, da jeg nok vil bruge den relativt sjældent :)
- hvor kan den købes og hvad koster den? (hm, hvad hedder den? - måske kan den lånes på biblioteket?)

Flere browsere (brusere, broscher etc.)? Hvis der dog bare var een browser der opfylder alle standarder, så ville alle være mere glade :)
- jeg ville i hvert fald ;)


Anyway, lige et tillægsspørgsmål.
Nu vil jeg jo gerne have billedet ud for hvert menupunkt til at skifte også. Hvordan klares det med JavaScript?
Avatar billede repsac Nybegynder
05. januar 2003 - 00:24 #18
(det kan jo gøres på samme måde med at vise og fjerne to billeder/tegn, men der er jo en smule "hackish"...)
Avatar billede repsac Nybegynder
05. januar 2003 - 00:36 #19
^^^ sådan bliver det lige i første omgang.

Kast lige et par svar, da jeg på udemærket vis er blevet hjulpet med mit problem :)
Avatar billede olebole Juniormester
05. januar 2003 - 00:38 #20
Til spm. ang. ECMA: http://www.ecma.ch/ - og nej, du kan (næsten) med garanti ikke finde den på biblioteket.

Det andet må du levere noget mere kode til ... meget gerne en URL, da vi så slipper for at skulle gætte os til en bunke PHP-genereret HTML-/JS-kode  :)
/mvh
Avatar billede jespernaur Nybegynder
05. januar 2003 - 00:44 #21
her
Avatar billede repsac Nybegynder
05. januar 2003 - 00:50 #22
=>olebole: Jeg sidder lige og flæsker i det - smider det op senere (måske først i morgen). Håber det går :)
Tak for linket, men hvad hedder bogen? - eller er det blot een af publikationerne der ligger på ecma.ch?
Avatar billede repsac Nybegynder
05. januar 2003 - 02:12 #24
=>olebole: tak!

Så har jeg flækket det ca. "færdigt" (læs: funktionelt)... http://but.auc.dk/~cath0233/work/vs/source.htm
Avatar billede olebole Juniormester
05. januar 2003 - 02:40 #25
Du kunne jo nøjes med ét span med billede. Så kunne du give billedet name="pic_$tekst_lower"

Så skulle vel du kunne skifte billedet med:
  var im = document.images["pic_"+id];
  im.src = ( im.src.indexOf("plus.gif")!=-1 )? "minus.gif" : "plus.gif";

/mvh
Avatar billede olebole Juniormester
05. januar 2003 - 02:44 #26
Det var et eksempel .... du skal naturligvis bruge "png" og ikke "gif" - ligesom dine billedstier selvfølgelig skal skrives rigtigt  ;o)
Avatar billede repsac Nybegynder
05. januar 2003 - 09:51 #27
Hm, måden jeg har lavet det på, er ikke helt hensigtsmæssigt - eks. kan man ikke have to menupunkter med samme navn... :-/

Anyway, olebole - tusind tak!
Det virker, men jeg forstår ikke helt hvad der egentlig sker.
- hvad metyder "?" og ":"?
- hvad skal "!=-1" gøre godt for?
Det må være noget i stil med at et "billede" (<img...>) har et id, som man så kan skifte(?)
Avatar billede olebole Juniormester
05. januar 2003 - 18:22 #28
Nej, man kan ikke have to menupunkter med samme navn ... det har man heller ikke  :)
Det er jo ikke smart med to vejskilte til Snave, der peger i hver sin retning - og kan man skrive noget forskelligt på forsiden af skiltet, kan man også give dem hvert sit serienummer på bagsiden. Håber, du forstår analogien  ;oD

Så det næste:
  bla = (betingelse)? "noget" : "noget andet";
er en forkortet udgave af en if-sætning. Der står i virkeligheden:
  if (betingelse) {
    bla = "noget";
  } else {
    bla = "noget andet";
  }

Og til betingelsen:
  ib = "dreng";
  alert( ib.indexOf("e") );
returnerer "2" ... nemlig den plads, "e" står på i strengen, der repræsenteres ved variablen ib (altså "dreng"). Husk første plads er "0" og derfor står "e" på plads nummer 2.
  alert( ib.indexOf("d") );
returnerer derfor "0".
Hvis _ikke_ bogstavet, vi leder efter eksisterer i strengen, returneres "-1" - f.eks:
  alert( ib.indexOf("k") );

Sætter vi det op i en betingelse, kan vi bruge operatoren "!=", som betyder "forskellig fra". Altså:
  if ( ib!=bo ) alert("ib er ikke bo");

Når jeg skriver:
  im.src = ( im.src.indexOf("plus.gif")!=-1 )? "minus.gif" : "plus.gif";
betyder det derfor:
"Hvis im.src (billedets øjeblikkelige source's sti/navn indeholder 'plus.gif', skal im.src sættes til 'minus.gif'. Ellers sættes im.src til 'plus.gif'."

im.src er i eksemplet jeg gav i mit forrige indlæg er sammensat af "pic_" og din variabel "$tekst_lower". Hvis variablen har værdien "ole", har billedet altså id'en "pic_ole". Altså ser eksemplet nu sådan ud:
  var im = document.images["pic_ole"];
  im.src = ( im.src.indexOf("plus.gif")!=-1 )? "minus.gif" : "plus.gif";
Hvis det billede i dokumentet, der hedder "pic_ole", har en source, der indeholder "plus.gif", skal dets source skiftes til "minus.gif".
Ellers skal sourcen skiftes til "plus.gif".

Håber, det hjalp lidt  ;o)
/mvh
Avatar billede repsac Nybegynder
05. januar 2003 - 19:13 #29
Det hjalp bestemt! Tusind tak!
Det jeg ikke forstod var at
  bla = (betingelse)? "noget" : "noget andet";
i virkeligheden er en if. Desuden forstod jeg ikke hvad
  indexOf()
gjorde :)
Avatar billede olebole Juniormester
05. januar 2003 - 19:42 #30
Det glæder mig - og selv tak  ;o)
Du skal da også lige ha' den 'helt sorte' if-sætning. Man kan faktsk også udelade parentesen:
  bla = "dreng";
  res = bla.indexOf("r")!=-1? "Fundet" : "Ikke fundet";
  alert(res);

Den ses ikke så ofte (og er vel heller ikke så overskuelig), men nu kender du den altså  :)
/mvh
Avatar billede olebole Juniormester
05. januar 2003 - 19:46 #31
Nå ja ..... vi kan da også lige lave en udvidelse:

if (betingelse) {
  bla = "Noget";
} else if (anden betingelse) {
  bla = "Noget andet";
} else {
  bla = "Noget tredie";
}

bla = (betingelse)? "noget" : (anden betingelse)? "noget andet" : "noget tredie";

/mvh
Avatar billede repsac Nybegynder
05. januar 2003 - 19:46 #32
Er det virkelig jf. standarden? (De færreste standarder anbefaler da uoverskuelig kode)

Anyway, nu et nyt problem:

- CODE ---------------------------------------------------------------
<script type="Text/JavaScript">
var id, type;   
    function change(id, type) {
        if (type == "menu") {
            var im = document.images["billede"];
            im.src = (im.src.indexOf("plus")!=-1)? "gfx/png/minus.png" : "gfx/png/plus.png";
        } else {
            /******************************
            * Ja, det er her den er gal! *
            *****************************/
            var im_a = document.images["billede_"+%];
            im_a = "gfx/png/empty.png";

            var im_b = document.images["billede_"+id];
            im_b.src = "gfx/png/arrow.png";
        }
    }
</script>

<img src="gfx/png/plus.png" name="billede" onClick="change('abe','menu');" alt="">
<br>
<img src="gfx/png/empty.png" name="billede_a" onClick="change('a','link');" alt="">&nbsp;
<img src="gfx/png/empty.png" name="billede_b" onClick="change('b','link');" alt="">&nbsp;
<img src="gfx/png/empty.png" name="billede_c" onClick="change('c','link');" alt="">
- /CODE --------------------------------------------------------------

... med andre ord vil jeg først "reset'e" alle billeder hvis navne starter på "billede_", og derefter ændre det ene.

Hvordan gøres det smart i JavaScript?
Avatar billede repsac Nybegynder
05. januar 2003 - 19:48 #33
ok... som forsvar mod den uoverskuelige måde at skrive det på, kan man da sige at det er gennemført (altså ikke kun et særtilfælde...).
Avatar billede repsac Nybegynder
05. januar 2003 - 19:49 #34
... men det gælder vel kun på boolske værdier... (eller kan man også lave noget "case"-halløj?)
Avatar billede repsac Nybegynder
05. januar 2003 - 19:52 #35
Tilføjelse til min post pr. 05/01-2003 19:46:55
Jeg "leger" at "%" er et wildcard... :)
Avatar billede repsac Nybegynder
05. januar 2003 - 20:01 #36
Hvor, stop - det er jo slet ikke nødvendigt!
- Note til mig selv: "Husk at tænke bare en lille smule"
;)
Avatar billede olebole Juniormester
05. januar 2003 - 21:44 #37
"Jeg snakker med mig selv,
snakker med mig selv.
Taler med mit bedre jeg."  :D

Jeg er ikke rigtig klar over, om du endte med at have probs ... please forklar, hvis det er tilfældet.

Ja, short-hand-if'en med parentesen er i hvert fald helt i overensstemmelse med standarden i JS - og i øvrigt også i PHP (og andre sprog, jeg ikke selv behersker). Dog med den undtagelse, at man i PHP ikke kan lave udvidelsen i (05/01-2003 19:46:35). Her kan man kun have én betingelse i udtrykket.
Skal jeg være helt ærlig, ved jeg ikke om short-hand-if'en uden parentes er 'lovlig'. Jeg bryder mig ikke om den og bruger den derfor ikke selv.

I begyndelsen, fandt jeg også short-hand-if'er uoverskuelige ... idag foretrækker jeg dem. Sådan går det nogen gange  :)
/mvh
Avatar billede erikjacobsen Ekspert
05. januar 2003 - 22:11 #38
Det kan man vel godt i PHP, Ole:

print $a==2?7:$b==2?8:9;
Avatar billede olebole Juniormester
05. januar 2003 - 23:10 #39
Hmmmm ..... jeg mener, jeg før er løbet panden mod muren med noget à la:

$bla = (betingelse)? "noget" : (betingelse_2)? "noget andet" : "Så det her da!";
print $bla;

Men jeg har zq så mange 'uforklarlige' buler i panden  :D
/mvh
Avatar billede olebole Juniormester
05. januar 2003 - 23:17 #40
Erik >> Nu har jeg testet - og det ser ud til, jeg har ret:

<?
$bla = (1==1)? "noget" : (3==2)? "noget andet" : "Så det her da!";
print $bla;
?>

printer "noget andet", uanset hvilken af de to betingelser der gøres sand. Hvis de begge er falske, printes "Så det her da!".
/mvh
Avatar billede erikjacobsen Ekspert
05. januar 2003 - 23:33 #41
Pjat med dig Ole. Du har glemt dine paranteser.
Nå ja - det gjorde jeg jo også .. :)

print $a==2?7:($b==2?8:9);
Avatar billede repsac Nybegynder
06. januar 2003 - 01:22 #42
Ole: jeg løste selv mit problem ved blot at tænke en smule; eller rettere: jeg (tror) jeg ved hvordan det skal kodes... :)

alle: det gør også det helere mere overskueligt hvis der kommer et par paranteser på :)
Avatar billede olebole Juniormester
06. januar 2003 - 01:34 #43
Erik >> Ja, det ser også mere 'rent' ud  :)

Men i JS er det ikke nødvendigt med parenteser:
  var bla = (1==1)? "noget" : (3==2)? "noget andet" : "Så det her da!";
  alert(bla);
fungerer helt fint - og er, så vidt jeg ved, gangbart ifølge ECMA. Men det er klart mere stringent at anvende parenteser, der angiver afviklingsfølgen  ;o)
/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 16:48 #44
Måske nogen har tid til at se på et "lille" problem?

Når jeg forsøger at fejlfinde siden (fnof.dyndns.dk/vs/www/), er de eneste to fejl jeg får følgende to:
"Error: invalid break
Source file: http://fnof.dyndns.dk/vs/www/            Line: 79
    break;"

og

"Error: overout not defined"

Den første fejl tror jeg selv kan jeg fikse, men den anden fatter jeg ikke. Funktionen "overout" findes... (hm, _skal_ en funktion returnere noget måske?)

På forhånd tak for hjælpen!
Avatar billede olebole Juniormester
09. januar 2003 - 17:18 #45
1. Fejl ligger her:
    // Til at skifte icon med.
    // FIXME: IE5.0 kan ikke lide "break" hvis det ikker i et loop.
    if (im.src.indexOf("plus_onover")!=-1) {
        im.src = "gfx/png/minus_onover.png";
        break;

'break' bruger man til at stoppe et loop. Man kan bruge det ved:
for (i=0; i<15; i++) {
  if (betingelse) {
    // Gør et eller andet
    break;
  }
}

Hvis betingelsen opfyldes inden loop'et er nået til i=14, stoppes loopet og koden derefter afvikles.

Den anden fejl får jeg ikke.
/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 17:26 #46
=>olebole: det ved jeg... problemet der så opstår når jeg forsøger at udbedre fejlen...
(se versionen der foreligger nu...)
Avatar billede repsac Nybegynder
09. januar 2003 - 17:27 #47
Findes der i øvrigt en online JavaScript-validator?
Avatar billede olebole Juniormester
09. januar 2003 - 17:33 #48
Jeg får ikke fejl i IE ... men i NS6. Fejlen ligger i, at du i denne linie ikke sammenligner ( == eller != ), men sætter lig med ( = ):
    // Til at skifte icon med.
    if (im.src.indexOf("onover")=-1) {

En online-validator til JS ...? Ja: OleBole  :D
Nej, jeg kender ikke en  ;o)
/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 17:37 #49
arh, møg-fejl...

Det burde vel også kunne gøre det at gøre følgende:
if (im.src.indexOf("plus.")!=-1) {
    im.src = "gfx/png/minus.png";
} else if (im.src.indexOf("minus.")!=-1) {
    im.src = "gfx/png/plus.png";
} ...

;D
Avatar billede repsac Nybegynder
09. januar 2003 - 17:46 #50
done :)
Avatar billede repsac Nybegynder
09. januar 2003 - 17:50 #51
Hm, nu mangler jeg så bare een funktion, nemlig en funktion der skjuler alle sagerne...
Er der en måde hvorpå jeg kan få fat i alle navne på billeder etc.?
Avatar billede olebole Juniormester
09. januar 2003 - 18:13 #52
var imArr = document.getElementsByTagName("IMG");
for ( i=0; i<imArr.length; i++ ) {
  imArr[i].style.visibility = "hidden";
}

/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 18:33 #53
"getElementsByTagName" - hvor finder jeg selv ud af hvad sådan noget hedder?
Er der ikke en god JavaScript-tutorial et sted - een som fører læseren længere end til bare at lave en alert ol.?
- ikke olebole@eksperten.dk ;)
Avatar billede repsac Nybegynder
09. januar 2003 - 18:58 #54
En funktion til at reducere en strings længde?
- JavaScripts php.net/substr
Avatar billede olebole Juniormester
09. januar 2003 - 19:00 #55
Det er ikke JavaScript, men DOM (Document Object Model), som beskrives af W3C (www.w3.org). At vi så bruger DOM'en til at kalde elementerne gennem i JS, er så en anden ting  ;o)
/mvh
Avatar billede olebole Juniormester
09. januar 2003 - 19:03 #56
var ib = "dreng";
  alert( ib.substring(2) );
returnerer "eng"

  VARIABEL.substring( START, [SLUT] );
/mvh
Avatar billede olebole Juniormester
09. januar 2003 - 19:04 #57
Men nærmer det her sig ikke efterhånden en online-tutorial?  *LooL*
Avatar billede repsac Nybegynder
09. januar 2003 - 19:09 #58
19:04:48
Jo :) Jeg vil bookmark'e dette spm med teksten "JavaScript-tutorial" ;)

Tusind tusind tak!
Avatar billede olebole Juniormester
09. januar 2003 - 19:15 #59
Hvis du bruger DreamWeaver ligger der en fin JS-reference idbygget (ikke tutorial). Så vidt jeg husker åbnes den med 'Ctrl+F1' eller 'Ctrl+Shift+F1'.
Det er en fomindsket udgave af O'Reilly's JavaScript-bog, som er _klassikeren_. Måske, du har set den ... hvid og grøn, med et næsehorn udenpå (kaldes også 'The Rhino').
/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 19:18 #60
Jeg bruger go'e gamle emacs :)

"_klassikeren_" - må ha' ;)
"fomindsket udgave" - hvor findes den? (også kun bog?)
Avatar billede olebole Juniormester
09. januar 2003 - 19:34 #61
Den formindskede udgave, jeg beskrev, ligger i DW  ;o)
Bogen findes i en 'moppesjong' på omkring 500 sider og i en pocket-udgave. Se også: http://www.oreilly.com
Check sitet _grundigt_ ud ... der er tonsvis af gode artikler om allehånde web-teknologi  :o)
Og så tror jeg, vi skal stoppe chatten her (selvom det er svært hyggeligt)  *LoooL*
/mvh
Avatar billede repsac Nybegynder
09. januar 2003 - 19:44 #62
"i DW" - arh, øv...

http://www.oreillynet.com/search/index.ncsp?sp-q=JavaScript&sp-k=all
- denne?

Helt i orden. Du har været til stor stor hjælp! Tusind tak!
Avatar billede repsac Nybegynder
20. januar 2003 - 03:05 #63
Er de brugere der vitterligt har hjulpet mig, ikke rare at poste et svar - dels så jeg ikke skal få flere mails om at jeg skal lukke spørgsmålet, og dels fordi I vitterligt fortjener dem?

På forhånd tak for hjælpen!
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