Avatar billede per1291 Nybegynder
28. oktober 2005 - 01:02 Der er 22 kommentarer og
2 løsninger

onKeyPress problem

Hej - Jeg har en HTMLkode, hvor jeg ønsker at give brugeren mulighed for at indtaste et ciffer:

<table><tr><td id="id17" onKeyPress='return handleCiffer("id17", event)'>&nbsp;</td></tr></table>

Min Javascriptkode ser sådan ud:

function handleCiffer(id,event)
{
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
if ((keyCode >= 48) && (keyCode <=57))
{
  var cif="0123456789".split("");
  var c=cif[keyCode-48];
  document.getElementById(id).innerHTML=c; return true;
}
else {return false;}
}

Koden bygger på et script jeg har fundet på Nettet, og den første linje i funktionen skulle tage højde for forskelle i diverse browsere. Den sidste del af scriptet kunne sikkert gøres mere elegant.

Men nu til problemet:
Koden virker i Internet Explorer, men den gør ingenting i Mozilla Firefox og Netscape. Til gengæld slår den Opera ihjel. Og nu troede jeg ellers lige jeg var så dygtig...

Hvad gør jeg galt? - Hilsen Per
Avatar billede roenving Novice
28. oktober 2005 - 10:06 #1
Tjah, Geckoen accepterer åbenbart slet ikke en keypress-event, men ellers har jeg lige gjort det lidt lettere:

<table><tr><td id="id17" onkeypress='return handleCiffer(this)'>asdf</td></tr></table>

<script type="text/javascript">
function handleCiffer(elm,e){
  e = e ? e : event;
  var kCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
  if (kCode >= 48 && kCode <= 57){
    elm.innerHTML = String.fromCharCode(kCode);
    alert(String.fromCharCode(kCode));
    return true;
  }else return false;
}

</script>

-- Operaen følger så med uden problemer, men bemærk lige, at den har specialfunktioner på tal-taster, så effekten bliver ret sjov, hvis du begynder at trykke på f.eks. 7 og 8 (zoom ud og zoom ind !-)

-- alerten er med for at vise fraværet af reaktion i Geckoerne, funktionen bliver simpelthen ikke kaldt !o]
Avatar billede per1291 Nybegynder
28. oktober 2005 - 16:52 #2
roenving -> Tak for HTML-forkortelsen:
onkeypress='return handleCiffer(this,event)'

Men det kan da ikke passe, at de andre browsere ikke kender ordet.
Så må man vel kunne gøre det på en anden måde?

Jeg er nu begyndt at tro at problemet er et helt andet, som jeg ikke har omtalt - nemlig at tabellen (incl. id="id17") er defineret i dokumentet vha. Javascript. - Hilsen Per
Avatar billede per1291 Nybegynder
28. oktober 2005 - 20:47 #3
Tilføjelse: Min sidste bemærkning viser sig at være uden betydning. Det gør ingen forskel, om jeg bruger Javascript ved generering af HTML-koden eller ej.

Mit grundlæggende problem er altså:
Hvordan får jeg de mest almindelige browsere til at læse hvilken tast jeg trykker på?

(Jeg husker nogle ord fra andre sprog: inkey og readkey...) - Hilsen Per
Avatar billede olebole Juniormester
29. oktober 2005 - 02:29 #4
<ole>

Både onkeydown og onkeypress virker i Gecko - men forskelligt  :)
Kik evt. i dette spm:
    http://www.eksperten.dk/spm/659386

/mvh
</bole>
Avatar billede roenving Novice
31. oktober 2005 - 00:18 #5
Men ikke på ikke-input-elementer ?-)
Avatar billede olebole Juniormester
31. oktober 2005 - 01:07 #6
- a' waaaaddddd ...??!!?!!! Det må du vist uddybe lidt, Jes - eller checke lidt bedre ud  ;o)

Det her fungerer fint:

<form>
<input type="text" name="foo" onkeypress="alert(event.which)">
</form>

- at så FF smide en af sine utallige, tåbelige exceptions - men hvad kan man forvente? Det er jo buggy FF, vi taler om  ;o)
Avatar billede roenving Novice
31. oktober 2005 - 01:09 #7
Pers idé går på at han med javascript laver et td-element redigerbart, eller hvad man nu skal kalde det !-)
Avatar billede olebole Juniormester
31. oktober 2005 - 01:09 #8
Dette virker, uden FF smider en exception:

<script type="text/JavaScript">
function bla(n) {
    document.getElementById("bar").firstChild.nodeValue = n;
}
</script>

<div id="bar">&nbsp;</div>

<form>
<input type="text" name="foo" onkeypress="bla(event.which)">
</form>

- gad vide, hvornår 'de' tager sig sammen og skruer en ordentlig browser sammen ... så er jeg zq ligeglad med, hvad den hedder!
Avatar billede olebole Juniormester
31. oktober 2005 - 01:11 #9
- hvor kommer input-elementerne så ind i (31/10-2005 00:18:11)?
Avatar billede olebole Juniormester
31. oktober 2005 - 01:12 #10
aarrrghhh ... 'ikke-input-elementer'  ;D
Avatar billede roenving Novice
31. oktober 2005 - 01:13 #11
Har du det med at vågne langsomt om vinteren ?-)

*rotflmao*
Avatar billede olebole Juniormester
31. oktober 2005 - 01:16 #12
- nogen gange har jeg indtryk af, jeg ikke fået alle mitokondrier (og hvad slimen ellers måtte gemme på) med ud af petriskålen  ;D
Avatar billede roenving Novice
31. oktober 2005 - 01:19 #13
Smitter det ?o]
Avatar billede olebole Juniormester
31. oktober 2005 - 01:26 #14
- for fa'en ... noget, man ikke har, kan zq da ikke smitte ... nå!  :D
Avatar billede roenving Novice
31. oktober 2005 - 01:28 #15
*lol*
Avatar billede olebole Juniormester
31. oktober 2005 - 01:36 #16
- men for nu lige at vende tilbage til spørgsmålet, så giver onkeydown og onkeypress jo egentlig kun mening i et element, hvor man kan sætte cursoren - og redigere. På den baggrund er det jo ikke så tosset, at FF ikke udløser disse events  :)

En løsning kunne jo være, at du holder øje med brugerens klik i dokumentet - og viser et ellers skjult input-element henover td'en, når brugeren klikker i denne.
Når brugeren så klikker udenfor - eller trykker 'Return' - flyttes input-indholdet over i td'en - og input-elementet gemmes  :)
Avatar billede olebole Juniormester
31. oktober 2005 - 02:11 #17
Du kan prøve noget à la dette:

<style type="text/css">
table {
    border-collapse: collapse;
}
td {
    padding: 0;
}
#editTD, #editInp {
    font: 12px verdana, arial, sans-serif;
    padding: 2px;
}
#editInp {
    position: absolute;
    width: 200px;
    top: 0;
    border: 0;
    display: none;
}
#editTD {
    width: 200px;
    border: 1px solid red;
}
</style>

<script type="text/JavaScript">
function getPos(elm) {
    for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
    return {x:zx,y:zy}
}
document.onclick = function(e) {
    var srcElm, pos, inp, td;
    e = e? e : event;
    srcElm = e.srcElement? e.srcElement : e.target;
    if (srcElm.id&&srcElm.id=="editInp") return;
    inp = document.getElementById("editInp");
    td = document.getElementById("editTD");
    if (srcElm.id&&srcElm.id=="editTD") {
        pos = getPos(td);
        inp.style.left = pos.x + "px";
        inp.style.top = pos.y + "px";
        inp.style.backgroundColor = "transparent";
        if (td.innerHTML!="&nbsp;") {
            inp.value = td.innerHTML;
            td.innerHTML = "&nbsp;";
        }
        inp.style.display = "inline";
        inp.focus();
    } else {
        if (inp.style.display!="inline") return;
        td.innerHTML = inp.value;
        inp.value = "";
        inp.style.display = "none";
    }
}
</script>

<input id="editInp" type="text">

<table>
<tr>
    <td id="editTD">&nbsp;</td>
</tr>
</table>

- det skal nok passes lidt til, men princippet skulle gerne virke  :)
Avatar billede olebole Juniormester
31. oktober 2005 - 02:13 #18
Hehe ... denne linje nåede jeg ikke at få lagt op i CSS'en:
  inp.style.backgroundColor = "transparent";

- det kan du dog nok selv rette  ;o)
Avatar billede per1291 Nybegynder
31. oktober 2005 - 15:24 #19
Denne kode løser problemet for IE, FF og NS:

HTML-kode:
<table><tr><td align='center' id="id17" onmouseover='markedField="id17";' onmouseout='markedField="";'>&nbsp;</td></tr></table>

JAVASCRIPT-kode:
var markedField=""
function handleCif(e)
{
  if (markedField == "") {return false};
  e = e ? e : event;
  var kCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
  if ((kCode >= 48 && kCode <= 57) || (kCode >= 96 && kCode <= 105))
  {
  if (kCode <= 57) {var c=""+(kCode-48)} else {var c=""+(kCode-96)};
  document.getElementById(markedField).innerHTML = c;
  return true;
  }
  else return false;
}
document.onkeydown=handleCif;

Opera udfører mit script, men først EFTER at have fulgt sin default-handling på onkeypress, onkeydown eller onkeyup. - Jeg ved ikke hvordan jeg får Opera til at makke ret.

olebole & roenving -> Venligst læg svar. Jeg foreslår 40:20 i Oles favør. - Hilsen Per
Avatar billede per1291 Nybegynder
01. november 2005 - 00:18 #20
olebole -> Min netforbindelse har været nede, så jeg havde ikke mulighed for at læse dine sidste forslag. Et skjult inputfelt lyder rigtigt, hvis Opera skal overbevises. - Hilsen Per
Avatar billede olebole Juniormester
01. november 2005 - 09:57 #21
- tjahh ... det er da en idé, der kan arbejdes videre med, om ikke andet  :)
Avatar billede roenving Novice
01. november 2005 - 17:40 #22
Oki '-)
Avatar billede olebole Juniormester
02. november 2005 - 00:01 #23
Tak for points  :)
Avatar billede roenving Novice
02. november 2005 - 00:06 #24
Ditto ;~}
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