30. juli 2003 - 14:13Der er
9 kommentarer og 1 løsning
Brug af piletaster
Jeg har en HTML tabel med 4x10 inputfelter. Jeg vil gerne kunne bevæge mig rundt med piletasterne således at pil ned svarer til 4 x tabulatortryk, pil op = skift+4 x tab, venstrepil = shift+tab, højrepil til tab.
Det kan man godt (og jeg kan senere vende tilbage til hvordan) - men har du tænkt på, at man også kan bruge piletaster til at navigere inde i et inputfelt? Jeg tror, at du vil få en konflikt - for hvad skal der ske, når brugeren f.eks. taster højre pil? Skal cursor flyttes et tegn frem i input-feltet (hvis muligt) - eller skal der "hoppes" til næste inputfelt? Hvad med at implementere det med f.eks. Shift + piletast eller Ctrl + piletast i stedet?
Du siger noget, det havde jeg ikke lige tænkt over. Shift eller Ctrl + piletast er fint. Mht op og ned er der ingen konflikt da der ikke er flere linjer i felterne.
Her er et fungerende eksempel - det er helt generisk, så antallet af rækker og kolonner er principielt ligegyldigt. Brug Ctrl + højre/venstre pil samt pil op/ned til at navigere:
<HTML> <HEAD> <TITLE>Naviger med piletaster</TITLE> <script> var boolCtrlDown = false; var curField = null;
function doKeyDown() { var elm = event.srcElement; curField = (elm.tagName.toUpperCase() == 'INPUT' && elm.type == 'text') ? elm : null; var kCode = event.keyCode; var boolNoCheck = false; switch (kCode) { case 37: if (boolCtrlDown) navVer('previous'); break; //Ctrl + venstre pil case 38: navHor('previous'); break; //pil op case 39: if (boolCtrlDown) navVer('next'); break; // Ctrl + højre pil case 40: navHor('next'); break; //pil ned } boolCtrlDown = (kCode == 17); event.returnValue = false; event.cancelBubble = true; }
function navVer(dir) { var elm = eval('curField.parentElement.' + dir + 'Sibling'); if (elm != null) { elm = elm.firstChild; if (elm != null && elm.tagName.toUpperCase() == 'INPUT' && elm.type == 'text') elm.focus(); } }
function navHor(dir) { var elm = eval('curField.parentElement.parentElement.' + dir + 'Sibling'); var ix = 0; var tmpElm = curField.parentElement; while (tmpElm.previousSibling) { ix++; tmpElm = tmpElm.previousSibling; } if (elm != null) { elm = elm.firstChild; if (elm != null) { i = 0; while (ix > i) { if (elm.nextSibling) { elm = elm.nextSibling; } else return false; i++; } if (elm.firstChild != null) elm.firstChild.focus(); } } }
Du skal blot tage alt det, der står imellem <script> og </script> og indsætte det i dit eget dokument samt indsætte onkeydown="doKeyDown()"> i dit table-tag. Så burde det virke :) NB: Kun testet i MSIE 6.0...
Foreløbigt tak. Jeg kan så oplyse at det ikke fungerer i NS7. I IE 5.5 fungerer navigeringen fint men ingen andre taster fungerer, så man kan ikke skrive noget i felterne. :( Hvis du kan fixe det skal jeg udløse dine point, og der er 30 ekstra hvis du kan få det til at funke under NS.
Jamen jeg har sq også rigtigt fået lavet ged i det :( Funktionen doKeyDown skal IKKE sætte event.returnValue = false og event.cancelBubble = true hver gang, men kun når piletasterne bruges. Den skal se sådan ud:
function doKeyDown() { var elm = event.srcElement; curField = (elm.tagName.toUpperCase() == 'INPUT' && elm.type == 'text') ? elm : null; var kCode = event.keyCode; var boolNoCheck = false; switch (kCode) { case 37: if (boolCtrlDown) navVer('previous'); event.returnValue = false; event.cancelBubble = true; break; //Ctrl + venstre pil case 38: navHor('previous'); event.returnValue = false; event.cancelBubble = true; break; //pil op case 39: if (boolCtrlDown) navVer('next'); event.returnValue = false; event.cancelBubble = true; break; // Ctrl + højre pil case 40: navHor('next'); event.returnValue = false; event.cancelBubble = true; break; //pil ned } boolCtrlDown = (kCode == 17); }
Jeg har ikke lige en NS7 ved hånden til at teste, men følgende virker sandsynligvis (også) i NS7:
function doKeyDown(e) { if (!e) var e = window.event; if (e.keyCode) kCode = e.keyCode; else if (e.which) kCode = e.which; var elm; if (e.srcElement) elm = e.srcElement; else if (e.target) elm = e.target; else return false; curField = (elm.tagName.toUpperCase() == 'INPUT' && elm.type == 'text') ? elm : null; var boolNoCheck = false; var boolDoCancel = false; switch (kCode) { case 37: if (boolCtrlDown) navVer('previous'); boolDoCancel = true; break; //Ctrl + venstre pil case 38: navHor('previous'); boolDoCancel = true; break; //pil op case 39: if (boolCtrlDown) navVer('next'); boolDoCancel = true; break; // Ctrl + højre pil case 40: navHor('next'); boolDoCancel = true; break; //pil ned } boolCtrlDown = (kCode == 17); if (boolDoCancel) { if (e.returnValue) e.returnValue = false; if (e.cancelBubble) e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); } }
Fungerer nu perfekt i IE, Jeg takker ærbødigt. Fungerer ikke i NS, så du får foreløbigt de 30.
Synes godt om
Ny brugerNybegynder
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.