Avatar billede mekaniker Nybegynder
15. december 2004 - 11:36 Der er 5 kommentarer og
1 løsning

Script virker ikke i firefox

Hvorfor virker dette ikke i firefox..?

document.onkeydown = test;
function test()
    {
    alert(event.keyCode);
    }

Og er der nogle der har en løsning, så det virker i alle browsere. Jeg bruger det til at åbne et popupvindue, hvis der bliver trykket på en bestemt tast.
Er der nogle som evt. kunne teste det i NS..?
Avatar billede skovenborg Nybegynder
15. december 2004 - 11:40 #1
Det er pga. af mozillas anderledes måde at håndtere event-objektet på. Her skal det nemlig smides ind som argument, hvilket document.onkeydown automatisk gør:
  document.onkeydown = test;
function test(e)
    {
    e = (typeof e == "undefined") ? event : e;
    k = (typeof e.which == "number") ? e.which : e.keyCode;
        alert(k);
    }
Avatar billede skovenborg Nybegynder
15. december 2004 - 11:40 #2
forresten forstår firefox nu godt keyCode, men af hensyn til tidligere versioner bruges which istedet.
Avatar billede mekaniker Nybegynder
23. december 2004 - 10:23 #3
Det virker....! Helt perfekt.

>> Skovenborg

Jeg er ikke helt så stærk i javascript, og jeg kan ikke lige gennemskue din kode.
Hvis du gider, så ville det være fedt hvis du kunne skære det lidt up i pap for mig.

Hvis, du ikke har tid eller gidder, så læg et svar alligevel, så du kan få nogle point's

Tak for hjælpen, og God Jul
Avatar billede skovenborg Nybegynder
23. december 2004 - 12:07 #4
jo, det kan jeg godt:
document.onkeydown = test; kender du vel - altså den kører funktionen test når en tast bliver trykket. Nu er det sådan, at Firefox (ellere rettere sagt Mozilla-familien) har en anden måde at håndtere events på end IE. De understøtter umiddelbart begge to keyCode propertien (dog kun i nyere versioner), men problemmet er blot deres forskellige måde at få fat i event-objektet på.

Normalt i Firefox kan man få fat i event-objektet ved at sende det via et argument. Dette gør document.onkeydown automatisk i Mozilla, så vi henter det via test(e), så at e, når funktionen bliver kaldt, indeholder det event-objekt vi er interesseret i.

Problemmet er nu: Det gør IE ikke. Til gengæld kan vi skaffe adgang til event objektet på den måde du oprindeligt også gjorde, men da dette giver en fejl i Mozilla er det jo ikke så smart. Bare Mozilla skal teste for ordet event går det galt (event bliver faktisk brugt i Mozilla, bare ikke direkte i en funktion), så vi kan ikke ligefrem sige:
if (event) { // IE kode}
else { // mozilla kode
altså teste om browseren kender event.

Vi udnytter så istedet at e argumentet er tomt i IE i denne linie:
e = (typeof e == "undefined") ? event : e;
Jeg ved ikke om du kender ?: operatoren, men den fungerer sådan at det indenfor parenteserne bliver testet for true eller false. Hvis den er true returneres det efter spørgsmålstegnet og hvis den er false returneres det efter kolon.
Fx:  var a = (2 == 3) ? "2 er lig 3" : "2 er ikke lig 3"; - prøv at gætte hvad a bliver her !-)

Nå, tilbage til koden:
e = (typeof e == "undefined") ? event : e;
Hvis typen af e er undefined (udefineret), så får e værdien event (til IE) og hvis e er defineret, som den bliver i Mozilla, ja så får den bare sig selv som værdi. Dette er også det samme som at skrive:
if (typeof e == "undefined") {e= event;} men den anden måde er lidt pænere. Grunden til jeg skriver (typeof e == "undefined") og ikke bare (e == false) eller (!e) er pga. nogle dårlige erfaringer med IE5, som laver fejl på den måde.

Det sidste stykke kode er lidt på samme måde. Her tester vi bare for om browseren bruger which eller keyCode til at finde knappens værdi. (typeof e.which == "number") tester altså om e.which er et nummer, hvis det er det bliver k sat til e.which og ellers bliver den sat til e.keyCode. Begge to indeholder den samme talværdi for hver knap - så her er der ikke noget at være bange for.

Håber det gav en bedre forståelse - selvom jeg blev revet lidt med, men jeg syntes det var vigtigt at forstå forskellen. Og glædelig jul o<:-)
Avatar billede mekaniker Nybegynder
27. december 2004 - 10:29 #5
Tak for den udførlige forklaring, så lærte jeg da en hel masse...!
Jeg er nemlig ikke så meget for at bruge noget kode som jeg ikke forstår, så derfor skal du have mange tak for forklaringen. Jeg kendte ikke ? operatoren, men det er da helt sikkert noget jeg også kan bruge andre steder.

Det du har taget dig tid til her, er prisværdigt for mig. Tænk hvis alle brugere af eksperten gav sig tiden til dette, hvilket suverænt forum "Eksperten" ville blive..!

>> skovenborg
Jeg er superglad, for dit svar og vil ønske dig et rigtig godt nytår.

//Mekaniker
Avatar billede skovenborg Nybegynder
27. december 2004 - 15:59 #6
jamen du er så ganske velkommen (det er jo trods alt jul) - og et rigtigt godt nytår til dig også (samt tak for points :-)
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