Avatar billede Peter Praktikant
19. september 2005 - 21:48 Der er 33 kommentarer og
1 løsning

Simpelt script, skifte className, noget går galt.

Hej eksperter.
Javascript er ikke lige mig og nu har jeg siddet noget og stirret på dette script:

<script type="text/javascript">

Hover=function() {
    identity=document.getElementById("navn").getElementsByTag("LI");
    identity[0].onmouseover=function() {
        this.className=" over";
    }
    identity[0].onmouseout=function() {
        this.className="");
    }
}
window.onload=Hover;
</script>

I min html har jeg en linje der ser sådan ud:
<li id="navn"><a href="#">Test</a>

Det var så meningen at dette list item skulle få tildelt en klasse med hover, men intet virker. Der er helt sikkert en fejl i scriptet, men jeg kan ikke rigtigt finde den.
Avatar billede softspot Forsker
19. september 2005 - 21:52 #1
<script type="text/javascript">

function Hover() {
    identity=document.getElementById("navn").getElementsByTag("LI");
    identity[0].onmouseover=function() {
        this.className=" over";
    }
    identity[0].onmouseout=function() {
        this.className="");
    }
}
window.onload=Hover;
</script>
Avatar billede Peter Praktikant
19. september 2005 - 22:00 #2
Det virker ikke, havde endda prøvet det.
Jeg har uploadet hele siden da det nok er lidt lettere så:
http://ng.nskjaer.dk/test2.html

Jeg vil gerne have at undermenuen kommer frem når man holder musen over midterste link.
Avatar billede softspot Forsker
19. september 2005 - 22:10 #3
<script type="text/javascript">
function Hover() {
    var identity=document.getElementById("navn");
    identity.onmouseover=function() {
        this.className=" over";
    }
    identity.onmouseout=function() {
        this.className="";
    }
}
window.onload=Hover;
</script>
Avatar billede Peter Praktikant
19. september 2005 - 22:14 #4
Virker heller ikke her, kan du få det til at virke?
Avatar billede softspot Forsker
19. september 2005 - 22:23 #5
Prøv lige at opdatere dit site...
Avatar billede Peter Praktikant
19. september 2005 - 22:25 #6
Er hermed gjort
Avatar billede Peter Praktikant
19. september 2005 - 22:26 #7
Men det letteste er måske at du kopierer siden over til dig selv og prøver dig frem lokalt fremfor at komme med løsningsforslaget her hvorefter jeg så skal teste om det virker.
Avatar billede softspot Forsker
19. september 2005 - 22:28 #8
Prøv lige at fjerne det mellemrum før " over" i dit className...
Avatar billede Peter Praktikant
19. september 2005 - 22:31 #9
Det gør ingen forskel.
Avatar billede softspot Forsker
19. september 2005 - 22:37 #10
Jeg tror ikke hover fungerer på andet end A-tags i IE, men du har måske også problemet i andre browsere?

Så med mindre det er et stylesheet problem, har jeg ikke flere bud...
Avatar billede softspot Forsker
19. september 2005 - 22:37 #11
Næh, det fungerer godt nok i FF
Avatar billede Peter Praktikant
19. september 2005 - 22:39 #12
Det er jo netop hele pointen, javascriptet udgør det jo for hover i IE. Det er korrekt at det virker i andre browsere.
Avatar billede Peter Praktikant
19. september 2005 - 22:40 #13
Det skal lige nævnes at jeg har et andet script som kan lidt mere der fungerer.
Avatar billede softspot Forsker
19. september 2005 - 22:51 #14
"Det er jo netop hele pointen" - eeeehm, du har jo ikke nævnt dette faktum nogen steder, så hvordan var det lige jeg skulle være opmærksom på dette?

At du skifter en class på runtime til en class som ikke har nogen effekt i IE kommer den jo ikke til at fungere af. Det havde været lidt mere vejledende hvis du havde beskrevet at det faktisk var det du var kommet frem til at og du nu søgte efter et alternativ til :hover på et element i IE...

Hvis du skal have det til at fungere i IE, så skal du jo nok påvirke left-attributten direkte på style-objektet i de funktioner du sætter op inde i Hover-funktionen og ikke skifte class...
Avatar billede Peter Praktikant
19. september 2005 - 23:06 #15
Som sagt har jeg et mere avanceret script der fungerer, det kan godt lade sig gøre at lave det sådan som jeg har skitseret, for ved skift af li's klasse bliver ul jo netop flyttet da den pludseligt bliver stylet anderledes.
Jeg er ret sikker på at scriptet har fejl, klassen bliver ikke ændret. Hvis man prøver at sætte en alert ind i scriptet bliver den ikke udført.

Jeg skulle da sikkert have beskrevet lidt nærmere hvad der skulle ske, men du spurgte nu heller ikke om noget.
Avatar billede Peter Praktikant
19. september 2005 - 23:13 #16
Det er herfra det hele stammer:
http://www.htmldog.com/articles/suckerfish/dropdowns/example/bones1.html
Men desværre er mine javascriptfærdigheder langt fra gode, så det lykkedes mig ikke rigtigt at omskrive funktionen. Grunden til at jeg vil omskrive den er fordi jeg kun skal have en drop down, derfor vil jeg gerne have så simpel en funktion som muligt.
Avatar billede softspot Forsker
19. september 2005 - 23:16 #17
Nej, hvis jeg ikke kan regne med den beskrivelse jeg får, så er vi da ude på et skråplan... eller hvad synes du? :)

Anyway! Hvis jeg kigger i din source nu, så ken jeg se at du har start på script-sektion to gange (og igen vil jeg da anbefale at du fjerner det mellemrum foran over i strengen " over"):

<script type="text/javascript">

<script type="text/javascript">
function Hover() {
    var identity=document.getElementById("navn");
    identity.onmouseover=function() {
        this.className=" over";
    }
    identity.onmouseout=function() {
        this.className="";
    }
}
window.onload=Hover;
</script>
Avatar billede Peter Praktikant
19. september 2005 - 23:38 #18
Det er jo sådan set ligegyldigt om du ved hvad effekten af scriptet skal være udover at skifte className. Scriptet indeholdt fejl og dem ville jeg gerne have fundet. Du kunne jo netop regne med den beskrivelse du fik, der er en fejl i dette script. Du fejlfandt så og jeg meldte ud om det virkede. Jeg kan ikke se hvorfor det skulle være nødvendigt for dig at vide at det var for at få hover på andet end a i IE. Bortset fra det synes jeg det er rimeligt klart at scriptet går ud på noget sådant, der er to actions, mouseover og mouseout.
Men jeg havde nok bare stirret for langt tid på skidtet hvilket havde gjort at der sneg sig diverse fejl ind.
Jeg fik selv løst problemet kort inden dit sidste indlæg, jeg startede simpelthen forfra og så virkede det.

Hvis man fjerner mellemrummet før over virker det ikke ordentligt, så ter det sig mærkeligt. Jeg skal ikke kunne sige hvorfor.

Tak for indsatsen, smid et svar og du får nogle point.
Avatar billede softspot Forsker
19. september 2005 - 23:42 #19
Det kunne være løsningsforslaget ville have været anderledes hvis mål et var tegnet op på forhånd, derfor kan det godt betale sig at abstrahere lidt mere fra problemet end bare at der er en fejl.

Anyway! Siden jeg ikke rigtig bidragede til løsningen, vil jeg ikke tage point for det, så ellers tak :)
Avatar billede olebole Juniormester
20. september 2005 - 01:27 #20
<ole>

Undgå for Guds (og dine brugeres) skyld at skifte CSS-klasse på elementer - det performer elendigt. Ved lidt mere komplicerede sider, kan det faktisk tage flere sekunder!
Årsagen er, at browseren ikke kan holde styr på alle kaskader og nedarvninger og derfor starter helt forfra med at beregne alle sidens styles og genrendere siden.

Det er altid betydeligt hurtigere at skifte de enkelte style-properties på elementet - også selvom der er rigtig mange  :)

/mvh
</bole>
Avatar billede olebole Juniormester
20. september 2005 - 01:36 #21
F.eks:

<script type="text/JavaScript">
var oOver = {"backgroundColor":"red", "color":"yellow", "borderColor":"yellow black black yellow"};
var oOut = {"backgroundColor":"yellow", "color":"red", "borderColor":"yellow"};
function swap(elm, act) {
    var o = (act=="over")? oOver : oOut;
    for (var x in o) elm.style[x] = o[x];
}
</script>

<div onmouseover="swap(this, 'over')" onmouseout="swap(this)"
    style="width:80px;margin:30px;text-align:center;background-color:yellow;color:red;border:1px solid yellow">Tekst</div>
Avatar billede Peter Praktikant
20. september 2005 - 19:01 #22
Hej Olebole, jeg vil lige overveje hvor mange styles der skal skiftes i det endelige resultat, det drejer sig kun om en klasse med to underklasser. Men menuen jeg er ved at lave er sådan set en suckerfish og jeg synes også andre drop down menuer lavet med ren css og en smule javascript gør det på samme måde, altså ved at skifte klassen. Indtil videre kan jeg i hvert tilfælde ikke mærke noget performanceproblem, så lige nu vil jeg lade koden afgøre problemet, altså hvad der er kønnest. Jeg vil i hvert tilfælde gerne undgå javascript i selve linket (jeg laver et link til en side med menuen så dem uden javascript også kan se en menu).
Avatar billede olebole Juniormester
21. september 2005 - 00:09 #23
Der sker præcis det samme uanset, hvormange klasser, der skiftes - hele dokumentet skal genberegnes.
Hvad der bruges rundt omkring, bør ikke være en retningslinje. Mange af de mest kult-omspundne 'web-guruer' har desværre ikke ret stor indsigt i, hvad de laver og skriver om  :)

Hvis du sørger for at sortere alle robotter fra din statistik (også de, der identificerer sig som en browser), vil du opdage, at der stort set ikke er nogen, der surfer uden JavaScript nu om dage.
De par stykker er iøvrigt vandt til, at intet på WWW virker for dem  ;o)
Avatar billede Peter Praktikant
21. september 2005 - 18:32 #24
Har du et link til lidt mere omkring skift af klasse og genberegning af hele siden?

Jeg er klar over at meget få surfer uden javascript, men det betyder ikke så meget for mig at lave en ekstra side der indeholder menuen og en smule tekst.
Jeg havde fået kigget en smule forkert på koden du skrev, jeg vil da klart overveje din metode da den jo nok kan laves ret simpelt uden alt det style inline. Især også fordi det nok kun er left: Xem; der skal ændres.
Tak for input, jeg tester og vender tilbage snarest.
Avatar billede olebole Juniormester
21. september 2005 - 18:47 #25
MS skriver en lille smule om det her, hvor de advarer mod at skifte klasser:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/perf/dhtmlperf.asp
Avatar billede Peter Praktikant
21. september 2005 - 19:36 #26
Men hvis man i stedet kigger her:
http://www.quirksmode.org/dom/classchange.html
er konklusionen jo den stik modsatte og forskellen er samtidigt ikke ret stor i forhold til om man bruger den ene eller den anden metode. Derudover må jeg give ham ret i at det er en klar fordel at holde præsentation skarpt adskilt fra indhold, og det kan man jo ikke hvis man skifter styling og ikke klassenavn.
Avatar billede roenving Novice
21. september 2005 - 19:45 #27
Men han tester jo også et dokument, som er særdeles sjældent i virkeligheden ...

Hvis det er et virkeligt dokument med en kompliceret struktur, hvor forskellige elementer er nestet dybt inde i hinanden, og man skal ændre et par style-properties for et relativt begrænset antal elementer, som normalt vil være tilfældet, er jeg helt sikker på, at man vil få et fuldstændig anderledes resultat !-)
Avatar billede olebole Juniormester
21. september 2005 - 20:21 #28
- og så kan man jo gøre, som jeg har gjort (og mener, roenving også har gjort): Teste selv  :)

Iøvrigt deler jeg fuldt og helt dit ønske om at skille indhold, visuel præsentation og funktionalitet, som jo er selve rygraden i W3C's arbejede.
Set i det lys er 'hoover' jo en ren katastrofe, da lige netop den hører til under funktionalitet - og ikke visuel præsentation  :)

Derfor er det eneste logiske at bruge JavaScript til style-ændringer ved mouse-events  ;o)
Avatar billede Peter Praktikant
22. september 2005 - 16:56 #29
olebole > Har du et link til en test du har lavet?
Jeg kunne sikkert godt sætte mig ned og bruge en halv krig på at lave et stykke javascript der kan teste det, men jeg synes nu altså at jeg har andet at lave, så hvis du allerede har et script jeg måske kunne indsætte ville det jo være helt perfekt.
Men hvis jeg via javascript skifter klassenavn frem for at skifte en style, så kan jeg jo stadigvæk styre alt fra css-filen hvorimod jeg ellers skal til at rode i både markup og style hvis jeg begynder at ændre styles i javascriptet.

Roenving > Det kan du nok have ret i, hvis du har nogle tal på et normalt dokument vil jeg da meget gerne se dem. Men jeg vil sige at jeg ikke indtil videre kan mærke nogen forsinkelse når jeg laver en hover, så et helt stort problem kan det da ikke være (sidder på en 800MHz og tester).
Avatar billede olebole Juniormester
22. september 2005 - 17:12 #30
Nej, du styrer intet fra CSS-filen, når det er brugeren der via sine handlinger styrer, hvad der sker. Det er og bliver et helt klassisk eksempel på begrebet 'funktionalitet' - og du behøver endikke komme i nærheden af markup'en for at skifte styles.

Nej, hvis jeg skulle have alle mine gamle tests liggende, var der vist ikke megen plads tilbage på WWW  :)
Et script kan det vel ikke være noget problem at skrive, når du har grunden - så er det bare at teste i nogle dokumenter med lidt mere kompleks CSS.

Spørgsmålet er så, om du overhovedet skriver i overensstemmelse med W3C og dermed skriver kompleks CSS - eller om du skriver ligeså dårlig CSS, som flertallet  ;o)
Avatar billede Peter Praktikant
22. september 2005 - 17:35 #31
Først og fremmest må jeg lige sige at mit CSS altid validerer ifølge jigsaw, om det er kompleks ved jeg ikke rigtigt, denne side er rimeligt simpel så det er det sikkert ikke.
Jeg er ikke helt sikker på om vi er enige mht. funktionalitet og styling. Jeg er vel enig i at det er funktionalitet eftersom det er menuen på siden, men det er jo sådan set stylingen af menuen jeg piller ved og derved udseende. I hvert tilfælde vil det betyde at jeg skal pille i .html-filen (php-filen) hvis menuen skal se anderledes ud. Hvis jeg derimod vil tilføje menupunkter skal jeg tilføje til .html-filen som jo er meget fint.

Hvis jeg får lavet siden færdig snarest, kan du så hjælpe mig en smule med at lave et script, for som tidligere skrevet er javascript ikke lige mig.
Avatar billede olebole Juniormester
22. september 2005 - 18:28 #32
Tja, hvis det er sådan din verden ser ud, så er det det  :)
I min verden handler alle ændringer af dokumentet - på baggrund af brugerhandlinger - om funktionalitet. Jeg tror aldrig, jeg har set en konsistent forklaring, der peger i andre retninger - men jeg ville da gerne vide, hvad funktionalitet så er - og hvordan den adskiller sig fra visuel præsentation.

Om du skal ind og pille i HTML'en for at få menuen til at se anderledes ud, kommer anpå to ting: Dels, hvormeget der skal ændres - og dels, hvordan du koder.
Godt nok skal de forskellige områder adskilles, men der er jo grænser for, hvormeget de kan adskilles ... for tingene hænger jo saqmmen i sidste ende.
Hvis man er god til JS/DOM, er det dog ikke noget problem at adskille dem i meget høj grad  :)
Avatar billede Peter Praktikant
22. september 2005 - 18:46 #33
Tjohh, hvis man f.eks kigger på styling af links, så har det jo noget med brugerhandlinger at gøre, men det er helt klart styling efter min mening.

Som det fungerer nu skydes menuen ud til venstre når der ikke er hover og ind på plads ved hover, men menuen skal sikkert rettes et par px ind, så det vil sige at jeg skal rette det i javascriptet hvilket efter min mening ikke er kønt i forhold til at skulle rette det i css-filen.

Du skriver at det kommer an på to ting om man behøver ændrei html'en, når du skriver html'en, mener du så uden javascript eller med, for jeg tænker at der jo skal ændres i javascriptet. Men kan det da undgåes?
Avatar billede Peter Praktikant
14. november 2005 - 16:52 #34
Nå, dette spørgsmål gik vist lidt i stå, jeg lukker det. Hvis nogle af jer føler i har fortjent point, så smid lige 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