/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Returner til felt ved valideringsfejl
Fra : Jens Gyldenkærne Cla~


Dato : 19-01-04 17:08

Jeg har en side med et hav af indtastningsfelter - alle skal have
en talværdi mellem 0 og 999. Jeg har følgende javascript placeret i
onchange-hændelsen for alle implicerede felter:

function validerFelt(field){
   if (isNaN(field.value)){
      alert('Indtast en numerisk værdi');
      return false;
   }
   if (parseInt(field.value) < 0) {
      alert('Kun positive heltal er tilladt');
      this.focus();
      return false;
   }
   findAlle();
   return true;
}

findAlle er en funktion der beregner total for alle felterne og
differencen mellem denne total og et fast totalpoint-tal.
Funktionen kaldes således:

   onchange="validerFelt(this)"

- og den virker sådan set o.k. Men jeg ville gerne sætte fokus på
det felt der fejler, så det er nemt at rette fejlen. Det kan jeg
ikke få til at virke. Når jeg tabber igennem formen, bliver
markøren stående i feltet neden under det der fejler.

Hvad har jeg overset?

NB: parseInt godtager egentlig lidt for meget - da fx. 3.4 også
valideres. Hvad skal jeg skrive hvis det kun skal være positive
heltal der accepteres?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

 
 
Torben Brandt (24-01-2004)
Kommentar
Fra : Torben Brandt


Dato : 24-01-04 19:23

Jens Gyldenkærne Clausen skrev:

> function validerFelt(field){
>    if (isNaN(field.value)){
>       alert('Indtast en numerisk værdi');
>       return false;
>    }
>    if (parseInt(field.value) < 0) {
>       alert('Kun positive heltal er tilladt');
>       this.focus();

Skal det ikke være field.focus(); Det løser dog ikke problemet.

>       return false;
>    }
>    findAlle();
>    return true;
> }
>
>    onchange="validerFelt(this)"
>
> - og den virker sådan set o.k. Men jeg ville gerne sætte fokus på
> det felt der fejler, så det er nemt at rette fejlen. Det kan jeg
> ikke få til at virke. Når jeg tabber igennem formen, bliver
> markøren stående i feltet neden under det der fejler.

Jeg tror du skal se på hvad der sker når du trykker på tab og i hvilken
rækkefølge det sker.
Det lader til at onChange afvikles inden feltet mister fokus. Derfor
nytter det ikke noget at sætte fokus, for umiddelbart efter flyttes
fokus til næste felt (hvilket du allerede har bedt om med dit tab).

"[onChange] is executed before the code specified by onblur when the
control is also losing the focus."
<URL:http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/dhtml_reference_entry.asp?frame=true>

Det kan dog lade sig gøre hvis du sætter lidt forsinkelse på fokuseringen:
setTimeout(field.focus, 100); // 100 millisekunder

> NB: parseInt godtager egentlig lidt for meget - da fx. 3.4 også
> valideres. Hvad skal jeg skrive hvis det kun skal være positive
> heltal der accepteres?

Så er vi nok ude i regular expressions:
/^\d+$/.test(field.value)
Ovenstående vil være sandt netop hvis feltet indeholder ét eller flere
cifre. Hvis den også skal være sandt hvis feltet er tomt (f.eks. hvis
man sletter en allerede indtastet værdi) så skal '+' skiftes ud med '*'

/Torben


Jens Gyldenkærne Cla~ (24-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 24-01-04 22:33

Torben Brandt skrev:

> Det lader til at onChange afvikles inden feltet mister fokus.
> Derfor nytter det ikke noget at sætte fokus, for umiddelbart
> efter flyttes fokus til næste felt (hvilket du allerede har
> bedt om med dit tab).

Det giver jo en vis mening.


> Det kan dog lade sig gøre hvis du sætter lidt forsinkelse på
> fokuseringen:
> setTimeout(field.focus, 100); // 100 millisekunder

Er det en sikker metode? Har man ikke mulighed for at stoppe
hændelsesrækken og på den måde forhindre at tab-flytningen
eksekveres? Jeg tænker på noget med at kaste en fejl eller evt.
bare returne en stopkode. Af det link du gav, kan jeg se at
onchange har egenskaberne:

Bubles: no
Cancels: yes

- men jeg kan ikke finde nogen forklaring på hvad cancels dækker
over.

NB: Har onchange-koden adgang til den gamle værdi?


> Så er vi nok ude i regular expressions:
> /^\d+$/.test(field.value)

Takker - det vil jeg afprøve.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Torben Brandt (24-01-2004)
Kommentar
Fra : Torben Brandt


Dato : 24-01-04 23:11

Jens Gyldenkærne Clausen skrev:
> Torben Brandt skrev:
>
>>Det kan dog lade sig gøre hvis du sætter lidt forsinkelse på
>>fokuseringen:
>> setTimeout(field.focus, 100); // 100 millisekunder
>
> Er det en sikker metode? Har man ikke mulighed for at stoppe
> hændelsesrækken og på den måde forhindre at tab-flytningen
> eksekveres? Jeg tænker på noget med at kaste en fejl eller evt.
> bare returne en stopkode. Af det link du gav, kan jeg se at
> onchange har egenskaberne:
>
> Bubles: no
> Cancels: yes
>
> - men jeg kan ikke finde nogen forklaring på hvad cancels dækker
> over.

I praksis tror jeg forsinkelsesmetoden virker fint, men jeg fandt lige
denne side:
<URL:http://www.webdevelopersjournal.com/articles/jsevents2/jsevents2.html>

Det lader til at hvis man sætter
window.event.returnValue = false;
så vil resten af event'ene ikke blive udført. Så slipper du faktisk for
field.focus(), så du helt kan stoppe den for at forsætte.

Du kan dog ikke 'nøjes' med at returnere false - det opfatter rækken af
events åbenbart ikke...

> NB: Har onchange-koden adgang til den gamle værdi?

Hvilken? Altså field.value fra før man kom ind i feltet?
Det tror jeg ikke, men hvis man sætter onFocus på alle felterne, så kan
man have en variabel, der indeholder "det sidste felt man kom ind i"'s
indhold inden der blev rettet i det.


PS I øvrigt var mit link i forrige indlæg vist lidt for generelt. Du
fandt vi siden alligevel. For god ordens skyld og andre læsere var det:
<URL:http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/events/onchange.asp?frame=true>

/Torben


Jens Gyldenkærne Cla~ (26-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-01-04 11:06

Torben Brandt skrev:

> I praksis tror jeg forsinkelsesmetoden virker fint, men jeg
> fandt lige denne side:

> Det lader til at hvis man sætter
> window.event.returnValue = false;
> så vil resten af event'ene ikke blive udført. Så slipper du
> faktisk for field.focus(), så du helt kan stoppe den for at
> forsætte.


Lækkert - det virker perfekt, men desværre kun i IE.
Forsinkelsesmetoden virker tilsyneladende også kun i IE - øv.

Men da brugerne af siden alene er marketingsfolk, tvivler jeg på at
der kommer meget andet end IE på siden. Scriptet virker sådan set
også o.k. uden fokusering på det fejlende felt, men jeg synes bare
at det ser bedst ud når der er sammenhæng mellem en fejlmelding og
placeringen af inputmarkøren.

Kroppen af min fejlhåndteringsfunktion endte med at se ud som her:

   alert('Kun positive heltal er tilladt');
   if (window.event) {
      window.event.returnValue = false;
   }
   return false;

Jeg har pakket kaldet til window.event ind i et eksistenstjek for
at undgå javascriptfejl i non-IE-browsere.

Mange tak for hjælpen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste