[JS] elfproef (met loopje)

Pagina: 1
Acties:
  • 1.851 views sinds 30-01-2008
  • Reageer

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
Hoi!

ik wil graag meerdere BS-nummers checken op de 'elfproef'

met behulp van een bestaand script dat slechts 1 veld checked, ben ik aan de slag gegaan om een loopje te creeren dat meerdere velden checked en daar de juiste foutmelding bij produceerd.

tis dus een bijeenraapsel van 2 scripts die opzichzelf werken, maar in mijn combi helaas niet haha:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function check_bs(){

var fieldRequired = Array("extra_1", "extra_2", "extra_3", "extra_4", "extra_5");
var alertMsg = "De volgende BS-nummers zijn niet correct:\n";
var l_Msg = alertMsg.length;

// loopje van de ingevulde velden
for (var i = 0; i < fieldRequired.length; i++){

 bsnr=formobj.elements[fieldRequired[i]];
 checksum=0;
 
 // check cijfers
 if(isNaN(bsnr) || bsnr.length!=9){
  alertMsg += i + ". (te kort)" + "\n"
 }
 // check elfproef 
 else{
  for(i=0;i<8;i++){
   checksum += (bsnr.charAt(i)*(9-i));
  }
  checksum -= bsnr.charAt(8);
  
  // ongeldig nummer
  if(checksum%11!=0){
    alertMsg += i + ". (ongeldig)" + "\n"
  }
 }

}

if (alertMsg.length == l_Msg){
    return true;
} else {
    alert(alertMsg);
    return false;
}

}


mijn probleem,
GEEEN idee... maar het werkt niet
ik ben dus niet zo goed in js dus misschien dat iemand voor mij de fout kan ontdekken
hij blijft het formulier gewoon submitten... ipv een alert te geven!

het formulier werkt ongeveer zo:

HTML:
1
2
3
4
5
6
7
8
<form name="form" onSubmit="return check_bs();">
<input type="text" name="extra_1" size="9">
<input type="text" name="extra_2" size="9">
<input type="text" name="extra_3" size="9">
<input type="text" name="extra_4" size="9">
<input type="text" name="extra_5" size="9">
<input type="submit" value="Verzenden">
</form>


help! }:O

heeeeee ..... hoe is het?


  • André
  • Registratie: Maart 2002
  • Laatst online: 20-12 14:22

André

Analytics dude

Verander:
JavaScript:
1
bsnr=formobj.elements[fieldRequired[i]]

in
JavaScript:
1
bsnr=formobj.elements[fieldRequired[i]].value;


En wat heb je al geprobeerd, waar gaat het fout? Wat kun je met alerts achterhalen?

[ Voor 24% gewijzigd door André op 17-08-2006 12:32 ]


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:06

The Eagle

I wear my sunglasses at night

Misschien heb je iets aan de source van deze link:
http://www.cybercomm.nl/~broers/algorith.html#1001
Daar staat iig een werkende elfproef, hoef je alleen het bovenliggende / aanroepende progseltje nog maar te schrijven :)

* The Eagle doet wel eens het e.e.a. met bankrekeningen voor zijn werk ;)

[ Voor 14% gewijzigd door The Eagle op 17-08-2006 12:44 ]

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
bedankt.

heb ik nu gedaan, maar het helpt nog niet.

de elfproef werkt opzichzelf prima, alleen mijn script zelf niet.

het probleem is dat ik dus geen alert te zien krijg.
in IE krijg je linksonder meestal een js-error (geel icoontje)
deze zie ik heel snel voorbij flitsen, maar dan reload hij meteen de pagina weer
en is de error weg...

dus ik zie niet waar het foutgaat :(

[ Voor 9% gewijzigd door amoen op 17-08-2006 12:47 ]

heeeeee ..... hoe is het?


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je moet iig. je variabelen opnieuw initialiseren binnen de loop.

Who is John Galt?


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
justmental schreef op donderdag 17 augustus 2006 @ 12:47:
Je moet iig. je variabelen opnieuw initialiseren binnen de loop.
JavaScript:
1
2
3
4
for (var i = 0; i < fieldRequired.length; i++){

 bsnr=formobj.elements[fieldRequired[i]];
 checksum=0; 


gebeurt dat hier niet dan??

[ Voor 23% gewijzigd door amoen op 17-08-2006 13:15 ]

heeeeee ..... hoe is het?


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
ok...

aangezien de loop nog steeds niet werkt.
is het misschien een idee om met een soort van key-down effect te werken PER veld?

maar kan dit dan ook nadat ik 9 cijfers heb ingevult?
dus:

1) veldje
2) 9 cijfers invullen
3) check?

probleem is alleen dan dat als iemand maar 8 cijfers invult de check niet werkt
of toch wel? :( hellup

heeeeee ..... hoe is het?


  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12 13:49

WormLord

Devver

Volgens mij word de variabele formobj nergens gezet.

Na wat meer testen valt me op dat je in beide geneste loops de variabele i als teller gebruikt. Dat gaat natuurlijk fout.

[ Voor 54% gewijzigd door WormLord op 21-08-2006 11:03 . Reden: Nog wat meer getest. ]


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
ok...

ja klopt, daar kwam ik ook achter!
maar ik ben alweer een stukje verder:


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<script language="javascript">
function check_bs(){

var fieldRequired = Array("extra_1", "extra_2", "extra_3", "extra_4", "extra_5");
var alertMsg = "De volgende BS-nummers zijn niet correct:\n";
var l_Msg = alertMsg.length;

// loopje van de ingevulde velden
for (var i = 0; i < fieldRequired.length; i++){
 
 var bsnr = document.getElementById(fieldRequired[i]).value;
 checksum = 0;
 
 if (bsnr){
 
 
 // check cijfers
 if(isNaN(bsnr.value) || bsnr.length!=9){
  alertMsg += (i+1) + ". (te kort)" + "\n"
 }
 // check elfproef 
 else{
  for(i=0;i<8;i++){
   checksum += (bsnr.charAt(i)*(9-i));
  }
  checksum -= bsnr.charAt(8);
  
  // ongeldig nummer
  if(checksum%11!=0){
    alertMsg += (i+1) + ". (ongeldig)" + "\n"
  }
 }
 
 }

}

if (alertMsg.length == l_Msg){
    //return true;
    alert(alertMsg);
    return false;
} else {
    alert(alertMsg);
    return false;
}

}
</script>


HTML:
1
2
3
4
5
6
7
8
<form onSubmit="return check_bs();" method="post" name="form">
<input type="text" name="extra_1" id="extra_1" size="9" maxlength="9"><br>
<input type="text" name="extra_2" id="extra_2" size="9" maxlength="9"><br>
<input type="text" name="extra_3" id="extra_3" size="9" maxlength="9"><br>
<input type="text" name="extra_4" id="extra_4" size="9" maxlength="9"><br>
<input type="text" name="extra_5" id="extra_5" size="9" maxlength="9"><br>
<input type="submit" value="Verzenden">
</form>


hij returnd nu eindelijk de waarden. maar hij blijft op de een of andere manier hangen op de eerste check:
JavaScript:
1
2
3
 if(isNaN(bsnr.value) || bsnr.length!=9){
  alertMsg += (i+1) + ". (te kort)" + "\n"
 }


iemand?

[ Voor 35% gewijzigd door amoen op 21-08-2006 11:07 ]

heeeeee ..... hoe is het?


  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12 13:49

WormLord

Devver

Vervang regels 23 t/m 26 eens door:
JavaScript:
1
2
3
4
  for(j=0;j<=8;j++)
  {
   checksum += (bsnr.charAt(j)*(9-j));
  }

Dan heb je wel een correcte implementatie van de elf-proef en gebruik je een andere teller-variabele voor de binnenste loop.

  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
OK het werkt NU!

het probleem zat op het einde in "isNaN"
die check heb ik weggeflikkerd!
de invoer-persoon moet maar gewoon cijfers typen...

bedankt allemaal voor de feedback
hier de code voor iemand die het ooit nog nodig heeft:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<html>
<head>
<script language="javascript">
function check_bs(){

var fieldRequired = Array("extra_1", "extra_2", "extra_3", "extra_4", "extra_5");
var alertMsg = "De volgende BS-nummers zijn niet correct:\n";
var l_Msg = alertMsg.length;

// loopje van de ingevulde velden
for (var i = 0; i < fieldRequired.length; i++){
 
 var bsnr = document.getElementById(fieldRequired[i]).value;
 checksum = 0;
 
 if (bsnr){
 
 
 // check aantal
 if(bsnr.length!=9){
  alertMsg += (i+1) + ". (te kort)" + "\n"
 }
 // check elfproef 
 else{
  for(j=0;j<8;j++){
   checksum += (bsnr.charAt(j)*(9-j));
  }
  checksum -= bsnr.charAt(8);
  
  // ongeldig nummer
  if(checksum%11!=0){
    alertMsg += (i+1) + ". (ongeldig)" + "\n"
  }
 }
 
 }

}

if (alertMsg.length == l_Msg){
    return true;
} else {
    alert(alertMsg);
    return false;
}

}
</script>
</head>
<body>
<form onSubmit="return check_bs();" action="volgende_pagina.php" method="post" name="form">
1. <input type="text" name="extra_1" id="extra_1" size="9" maxlength="9"><br>
2. <input type="text" name="extra_2" id="extra_2" size="9" maxlength="9"><br>
3. <input type="text" name="extra_3" id="extra_3" size="9" maxlength="9"><br>
4. <input type="text" name="extra_4" id="extra_4" size="9" maxlength="9"><br>
5. <input type="text" name="extra_5" id="extra_5" size="9" maxlength="9"><br>
<input type="submit" value="Verzenden">
</form>
</body>
</html>

heeeeee ..... hoe is het?


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Ehm wat is een BS, want een standaard elf-proef kan in principe veel korter :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • amoen
  • Registratie: Juni 2003
  • Laatst online: 18-11 11:39
BtM909 schreef op maandag 21 augustus 2006 @ 12:51:
Ehm wat is een BS, want een standaard elf-proef kan in principe veel korter :)
BS-nummer is het Burgerservicenummer (vroeger sofi):
http://nl.wikipedia.org/wiki/Burgerservicenummer


dit is mijn elfproef (korter mag van mij best maar is niet nodig:
JavaScript:
1
2
3
4
5
6
7
8
9
  for(j=0;j<8;j++){
   checksum += (bsnr.charAt(j)*(9-j));
  }
  checksum -= bsnr.charAt(8);
  
  // ongeldig nummer
  if(checksum%11!=0){
    alertMsg += (i+1) + ". (ongeldig)" + "\n"
  } 

heeeeee ..... hoe is het?


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Nou ja, korter... Ik doelde ook op vollediger...

Even kort spammen wat ik ooit gebruikte voor bankrekening check (heb inmiddels een iets efficientere, maar kan die ff niet vinden):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function validateBank(){
eleObj        = document.getElementById('banknr');
elNameLength  = eleObj.value.length;
total         = 0;
bankLength    = 9;
result        = false;
regex         = new RegExp(/\d{9}$/);

    if ( regex.test(eleObj.value) ){ // Checked op lengte en cijfers
        for(var i = 0; i < elNameLength; i++){ // Begin elf-proef
            total += parseInt(eleObj.value.substr(i,1)) * bankLength;
            bankLength--;
        }
        if ( (parseInt(total) % 11) == 0){
            result = true;
        }
    }

    return result;
}

Je zou dus eventueel de extra check op cijfers ook kunnen overnemen op deze manier :)

[ Voor 5% gewijzigd door BtM909 op 21-08-2006 13:48 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1