28. november 2006 - 12:41Der er
14 kommentarer og 1 løsning
onkeypress registrerer ikke backspace og del
Jeg registrerer at der sker ændringer i et tekstfelt, så jeg kan vise at der er sket ændringer (så bruger husker at gemme). Jeg opdager blot at den ikke registrerer hverken backspace eller del. Kan jeg ændre på det på nogen måde, evt. via en anden end onkeypress?
<script type="text/JavaScript"> var bChanged = false; window.onbeforeunload = function(){ alert(bChanged) if (bChanged) return "Du har vist rettet noget"; } </script>
Jeg havde oprindeligt brugt onchange - men den blev jo først fyret af når focus blev fjernet fra tekstfeltet. Efter lidt tid blev jeg enig med mig selv om at det ikke var helt hensigtsmæssigt, da jeg ikke kunne være sikker på at brugeren netop fjernede focus FØR de forlod siden. Jeg har nemlig to måder at vise at der er sket ændringer: Tekstfeltets farve, samt farven på Gem-linket - og Det er ikke så smart at Gem-linket vises som inaktiv hvis der er sket ændringer ;)
Din anden løsning ville så rette bod på noget af det ;) Jeg vil i al fald gøre brug af begge løsninger - for folk kan, selvom det vises tydeligt på skærmen, stadig glemme at de har foretaget ændringer der ikke er gemt ;)
Så skal jeg blot have rettet en focus()-fejl i IE, men det kan nok klares ved hjælp af noget AJAX.
Tak for hjælpen - og den ekstra inspiration ;) Smid et svar og der er point ;)
åh ja, onchange event'en bliver ikke fyret af hvis man lukker vinduet - der siger alert'en false. Men jeg kan prøve at lave noget via førnævnte kombination - ellers kan jeg umiddelbart godt leve med dén detalje ;)
Hvis onchange skal virke, skal du nok klikke et sted i dokumentet (udenfor feltet), _før_ du klikker på det røde kryds. Det var det, jeg mente med: "... hvis du går direkte fra feltet til det røde kryds" ;o)
Mon ikke dette er en bedre løsning:
<script type="text/JavaScript"> window.onbeforeunload = function(){ var bChanged = false; var aInp = document.getElementsByTagName("input"); for (var i=0,j=aInp.length; i<j; i++) { if (aInp[i].type=="text" && aInp[i].value!=aInp[i].defaultValue) bChanged = true; } if (bChanged) return "Du har vist rettet noget"; } </script>
- og hvis det kun skal gælde visse tekstfelter, kan man jo sætte en klasse på dem - og spørge til den klasse i scriptet. I den forbindelse skal du vide,man gerne må sætte flere klasser på et element: <input class="foo bar" type="text">
- hvor 'foo' måske sætter udssende og 'bar' kun bruges til at genkende bestemte felter med i scriptet. Man kan nu også bruge dem begge til at style med, således at den sidste udvidder den første - men det er ikke det, jeg er udepå i dette eksempel ;o)
Skal du genkende på baggrund af 'bar' i eksemplet, kunne du skrive: if (aInp[i].className.indexOf("bar")!=-1 && aInp[i].value!=aInp[i].defaultValue)
hehe, jeg brugte lidt tid på at decode den med det røde kryds, for jeg bruger ikke standard XP skin :D
var bChanged=false; er jeg nødt til at have udenfor funktionen, ellers kan jeg ikke ændre på den med onclick på Gem-linket og så ville jeg få pop-up'en når jeg gemmer ;) Men jeg prøver lige den bedre løsning ;)
den bedre løsning virker også ganske fortrinligt :)
Jeg ender nok med at bruge begge dele, trods der checkes på hver key-event, og ofre lidt for brugervenligheden ;) Skal blot tage højde for tab-tasten (m.fl.)
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.