Avatar billede hansj Praktikant
07. februar 2011 - 17:42 Der er 10 kommentarer og
1 løsning

Et ekstra, unødvendigt skridt

Jeg har lavet en bestillingsformular på en webside med 14 input-felter og en enkelt textarea til løsagtige bemærkninger. Den fungerer efter hensigten, fint nok.

I sådan en formular flytter man jo rundt med tabulatortasten, og det kan være lidt akavet. Det sidder ligesom i håndleddet, det højre, at bruge piletasterne.

Nå, den lille bekvemmelighed fik jeg så installeret med noget script. Højre-venstre bevægelser kræver lidt flere krummelurer end op-ned, for hvis der allerede er skrevet tekst i et felt, skulle man gerne kunne bruge piletasterne på normal vis til at rykke sidelæns inde i feltet, et bogstav ad gangen.

Det problem blev også løst. Tilbage står blot et mindre mysterium, som jeg ikke fatter noget som helst af: med pil til højre lander markøren ganske vist i det rigtige felt, ikke noget at klage over der, men altså lige efter det første bogstav. Jeg forventede, og det gør jeg stadig, men ikke længere med samme optimisme, at markøren ville finde sig til rette allerforrest i feltet, foran det første bogstav. Men, nej, det nægter den stædigt og konsekvent, uanset hvad jeg forsøger af krumspring. Den vil nu engang slå sig ned i læ mellem første og andet bogstav, lunt og trygt.

Strengt taget er det hamrende ligegyldigt og savner enhver praktisk betydning, om markøren lander før eller efter første bogstav. Men ... man er jo sådan indrettet, ligesom de fleste andre mennesker, at man gerne vil forstå, gerne vil vide hvorfor.

Til at tjekke, om markøren er nået til slutningen af teksten i den venstre celle bruger jeg denne funktion:

function vedSlut()
    {
    var indhold=document.selection.createRange();
    var m=indhold.moveStart("character");
    if (m==1)
        {indhold.moveStart("character",-1);
        return false;};
    else
        return true;
    }

Og selve flytningen varetages af denne stump kode:

else if (tast==39 && vedSlut())               
    {feltNummer=felter.indexOf(fraFelt);
    {if (feltNummer>3 && feltNummer<9)
    {
    tilFeltNummer=feltNummer + 6;
    tilFelt=felter[tilFeltNummer];
    document.getElementById(tilFelt).setActive();
    };
    };
    };

Som det fremgår (for den opmærksomme læser) ligger felterne i et array, og de fem felter til højre har et indeks, som er 6 større end de fem til venstre.

Kan nogen gennemskue dette dunkle mysterium? Hvorfor rammer markøren netop mellem første og andet bogstav?

Formularen kan i øvrigt ses her: http://www.forlaganholt.dk/forlagform.shtml

PS, og til advarsel: mit script virker naturligvis ikke i Firefox; selve formularen gør, men ikke scriptet.
Avatar billede claes57 Ekspert
07. februar 2011 - 19:40 #1
og det har ikke noget med, at nogle ting starter med nummer 0? så du har tegn fra 1 til 26, men cursor skal være ved 0? Jeg ville bare trække 1 fra, og så lade det være med det.
Avatar billede tjens Nybegynder
07. februar 2011 - 20:06 #2
Det er fordi dit tastetryk til højre ikke ikke "bliver spist" af din funktion: Efter at du har flyttet focus til feltet, husker browseren stadig tastetrykket, og flytter en position til højre.

Så du skal altså have annulleret/brugt tastetrykket, så det ikke bliver udført i det nye felt.

En artikel om emnet, jeg fandt ved søgning: 
http://www.permadi.com/tutorial/jsEventBubbling/index.html
(Har ikke selv læst den. Find evt. andre om cancelbubble)
Avatar billede hansj Praktikant
08. februar 2011 - 07:58 #3
<b>tjens</b>, ja, selvfølgelig! Det er forklaringen. Du skal have tak for at have åbnet mine øjne. Og jeg tænker: hvorfor pokker kom jeg ikke selv på den forklaring?

Jeg har læst din henvisning, men det ser alt sammen meget kompliceret ud, i hvert fald ud fra mine, beskedne forudsætninger.

Jeg har forsøgt med at indsætte et "return false" til allersidst i flyt-til-højre proceduren i håb om således at stoppe den midlertidigt suspenderede pileflytning, men uden succes.

Foreløbig, men kommer tid, kommer råd, har jeg valgt en interimistisk, og dog acceptabel løsning. Jeg sender i stedet markøren til slutningen  af feltet, hvilket nemt kan lade sig gøre. I ovenstående flytte-procedure indsætter jeg til slut blot denne linje: "document.getElementById(tilFelt).select();", hvilket indebærer, at det oprindelige tryk på piletasten ikke får synlige virkninger.

Denne løsning skaber om ikke andet symmetri, hvilket jo for det meste er meget pænt: når man med piltasten flytter til venstre, kommer man længst muligt til venstre, nemlig allerforrest i venstre felt. Flytter man til højre, kommer man tilsvarende længst muligt til højre, nemlig til slutningen af eventuel tekst i det højre felt.

Men ... hvis der er nogen, der kender en ikke alt for kompliceret fidus til i en situation som den beskrevne at forhindre trykket på pil-til-højre i at få den originale virkning, nemlig ét markørryk til højre, så modtages den med glæde.

Jeg ville jo helst have markøren til at lande allerførst i det højre felt.
Avatar billede hansj Praktikant
08. februar 2011 - 07:59 #4
Nå, koder skal i kantedede parenteser, ikke mellem ulighedstegn.
Avatar billede hansj Praktikant
08. februar 2011 - 22:58 #5
Så fandt jeg bremsen, der brat kunne stoppe markøren og afholde den fra unødvendige skridt.

Efter sidste linje i flytte-proceduren, altså efter denne linje:

document.getElementById(tilFelt).setActive();

indsættes denne endegyldige afslutning på hele scriptet:

window.event.returnValue=false;

Dermed annulleres virkningen af det tastetryk, som oprindeligt satte hele scriptet i bevægelse, nemlig trykket på pil-til-højre.

Så enkelt var det.
Avatar billede hansj Praktikant
22. februar 2011 - 14:06 #6
Tråden er hermed lukket.
Avatar billede tjens Nybegynder
23. februar 2011 - 11:56 #7
Hermed et svar, så du kan lukke.
Avatar billede hansj Praktikant
23. februar 2011 - 12:13 #8
Lukket, og ingen pointsgivning. Jeg fandt selv løsningen.
Avatar billede hansj Praktikant
23. februar 2011 - 12:13 #9
Hov, skal man acceptere for at lukke? Det være hermed gjort.
Avatar billede hansj Praktikant
08. april 2011 - 07:51 #10
Svar accepteret.
Nul points.
Avatar billede hansj Praktikant
08. april 2011 - 07:52 #11
Svar accepteret.
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

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