Permalänk
Medlem

javascript, vad har jag missat?

var as = /^[0-9]{6}[-+][0-9]{4}$/; var pn=document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month >= 12 || day >= 30) { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } }

Får inte riktigt detta att fungera, vad är det jag missar?!

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Vad fungerar inte? Vad får du för felmeddelande? Det första jag såg var följande:
1. Ditt regex ser inte rätt ut. Vad tänker du dig att [-+] gör? Vill du inte bara ha ett -?
2. Vissa månader har 31 dagar.
3. Din kod är oerhört inkonsekvent. Bestäm dig för hur du vill sätta måsvingar och håll dig till det viset. Samma sak med mellanslag vid variabeltilldelning.
4. Använd [code][/code]-taggar för att bibehålla kodens indentering.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

Vad fungerar inte? Vad får du för felmeddelande? Det första jag såg var följande:
1. Ditt regex ser inte rätt ut. Vad tänker du dig att [-+] gör? Vill du inte bara ha ett -?
2. Vissa månader har 31 dagar.
3. Din kod är oerhört inkonsekvent. Bestäm dig för hur du vill sätta måsvingar och håll dig till det viset. Samma sak med mellanslag vid variabeltilldelning.
4. Använd [code][/code]-taggar för att bibehålla kodens indentering.

Den säger inte ifrån om jag skiter i att fylla i nånting i inputen och samma om jag bara skriver nå random bokstäver.
Det är för att kolla att - är inkluderat, vill att inputen ska vara ex 761214-8888, jo jag vet att vissa månader har 31 dagar, försöker lära mig javascript och iom det göra ett lättare validerings script för en form, har fastnat på personnr...

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av pellski87:

Den säger inte ifrån om jag skiter i att fylla i nånting i inputen och samma om jag bara skriver nå random bokstäver.
Det är för att kolla att - är inkluderat, vill att inputen ska vara ex 761214-8888, jo jag vet att vissa månader har 31 dagar, försöker lära mig javascript och iom det göra ett lättare validerings script för en form, har fastnat på personnr...

Lägg till ett else-statement med felmeddelande på din yttre if-sats. Som det är nu har du om det här stämmer, gör det här och saknar i annat fall, gör så här.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

Lägg till ett else-statement med felmeddelande på din yttre if-sats. Som det är nu har du om det här stämmer, gör det här och saknar i annat fall, gör så här.

Okej, förstår ungefär hur du menar, men ändå inte... har du något exempel på hur jag kan göra? är som sagt egentligen helt novis på detta kör i princip bara på trial and error

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Tror @LemonIllusion menar typ såhär

var as = /^[0-9]{6}[-+][0-9]{4}$/; var pn=document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month >= 12 || day >= 30) { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } else{ alert("Uppgiften mottogs korrekt"); kontakt.pnr.style.background = "green"; return true; } }

Visa signatur

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || MSI NVIDIA RTX 2070 Gaming Z 8GB || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || BeQuiet DarkRock Pro

Permalänk
Medlem
Skrivet av lollol7:

Tror @LemonIllusion menar typ såhär

var as = /^[0-9]{6}[-+][0-9]{4}$/; var pn=document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month >= 12 || day >= 30) { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } else{ alert("Uppgiften mottogs korrekt"); kontakt.pnr.style.background = "green"; return true; } }

Joo förstod det var någe sånt men får det inte att displaya error om jag inte fyller i

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av pellski87:

Okej, förstår ungefär hur du menar, men ändå inte... har du något exempel på hur jag kan göra? är som sagt egentligen helt novis på detta kör i princip bara på trial and error

var as = /^[0-9]{6}-[0-9]{4}$/; var pn = document.forms.kontakt.pnr.value; if (as.test(pn)) { // Om pn matchar regex var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month >= 12 || day >= 30) { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } } else { // Om pn inte matchar regex // Ge error }

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av pellski87:

var as = /^[0-9]{6}[-+][0-9]{4}$/; var pn=document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month >= 12 || day >= 30) { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } }

Får inte riktigt detta att fungera, vad är det jag missar?!

Får man inte vara född den 30:e eller senare, eller i december..?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

var as = /^[0-9]{6}[-+][0-9]{4}$/; var pn=document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month <= 13 && day <= 32) { return true; } } else { alert ("Fyll i korrekt personnummer xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } }

det där fungerar i princip, förutom att den släpper igenom att jag skriver ex 914752-2222 dvs över månad 12 och dag 31 vad är det nu jag missar?!

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av pellski87:

if (month <= 13 && day <= 32)

det där fungerar i princip, förutom att den släpper igenom att jag skriver ex 914752-2222 dvs över månad 12 och dag 31 vad är det nu jag missar?!

If-satsen som jag lämnade kvar säger: om (månad är-mindre-eller-likamed 13 OCH dag är-mindre-eller-likamed 32). Det är inte helt rätt.

Det större problemet är att du har nästlat dina if-satser på ett underligt sätt vilket är lite svårt att se pga hur du indenterat din kod. Först kontrolleras om strängen matchar din regex, och om den inte gör det visas en alert. Om regexet matchar så testar du månad/dag enligt ovanstående, men du har inte lagt till en else-sats för att visa ett fel ifall värdena är för stora.

Har du förresten tänkt på att vissa månader har mindre än 30 dagar?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

If-satsen som jag lämnade kvar säger: om (månad är-mindre-eller-likamed 13 OCH dag är-mindre-eller-likamed 32). Det är inte helt rätt.

Det större problemet är att du har nästlat dina if-satser på ett underligt sätt vilket är lite svårt att se pga hur du indenterat din kod. Först kontrolleras om strängen matchar din regex, och om den inte gör det visas en alert. Om regexet matchar så testar du månad/dag enligt ovanstående, men du har inte lagt till en else-sats för att visa ett fel ifall värdena är för stora.

Har du förresten tänkt på att vissa månader har mindre än 30 dagar?

okej, men jag har satt att om 13 eller mindre månad och 32 eller mindre dag return true annars ska alert visas? förstår att koden kan vara knepig att läsa och avig då jag är helt novis på det här

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

if (!as.test(pn) { return;}

Som teknocide nämner, så kan du testa regex först (och lägg till eventuell notifiering till användaren) så slipper du nesta nästkommande if loop, sedan kan du utgå ifrån att användaren har fyllt i giltig data och efterkommande kod körs bara i det fallet.

Permalänk
Medlem

var as = /^[0-9]{6}-[0-9]{4}$/; //nån får kontrollera ifall detta stämmer var pn = document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month > 12 || day > 31) { alert ("Fyll i korrekt personnummer"); //regex matchar, men ogiltiga siffror kontakt.pnr.style.background = "red"; return false; } else { return true; //regex matchar, giltiga siffror, allt är korrent. } } else { alert ("Fyll i personnummer i formatet xxxxxx-xxxx"); //regex matchar inte kontakt.pnr.style.background = "red"; return false; }

Permalänk
Medlem
Skrivet av ajp_anton:

var as = /^[0-9]{6}-[0-9]{4}$/; //nån får kontrollera ifall detta stämmer var pn = document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month > 12 || day > 31) { alert ("Fyll i korrekt personnummer"); //regex matchar, men ogiltiga siffror kontakt.pnr.style.background = "red"; return false; } else { return true; //regex matchar, giltiga siffror, allt är korrent. } } else { alert ("Fyll i personnummer i formatet xxxxxx-xxxx"); //regex matchar inte kontakt.pnr.style.background = "red"; return false; }

det där fungerar helt enligt hur jag vill ha det men vad är det som avgör vilken alert som visas om du förstår hur jag menar? ex om jag fyller i bokstäver så visas det första annars det andra?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av pellski87:

det där fungerar helt enligt hur jag vill ha det men vad är det som avgör vilken alert som visas om du förstår hur jag menar? ex om jag fyller i bokstäver så visas det första annars det andra?

Står som komment efter varje alert hur man har kommit dit.

Permalänk
Medlem

Om du använder 4-siffrigt år:

if ( month>12 || day>31 || ((month<7&&month%2==0)||(month>8&&month%2==1))&&day>30 || (month==2 && (day>29 || ((year%4||!(year%100))&&year%400 && day>28))) )

Om 2-siffrigt år, antar att 00 är 2000:

if ( month>12 || day>31 || ((month<7&&month%2==0)||(month>8&&month%2==1))&&day>30 || (month==2 && (day>29 || (year%4 && day>28))) )

Använd på egen risk, kan ha missat nån siffra här och en parentes där.

Permalänk
Medlem

<script> function validateform() { //scriptet för att validera namn börjar här. var n = document.forms.kontakt.namn.value; var ns = /^[A-Za-z ]{4,24}$/; if (n.match(ns) ) { return true; } else { alert("Fyll i ett korrekt namn!"); kontakt.namn.style.background = "red"; return false; } //scriptet för att validera email börjar här var x = document.forms.kontakt.email.value; var atpos=x.indexOf("@"); var dotpos=x.lastIndexOf("."); if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.lenght || x==null || x=="") { alert("Fyll i en korrekt E-post adress"); kontakt.email.style.background = "red"; return false; } //Här börjar scriptet för personnummer var as = /^[0-9]{6}-[0-9]{4}$/; var pn = document.forms.kontakt.pnr.value; if (as.test(pn)) { var year = pn.substr(0,2); var month = pn.substr(2,2); var day = pn.substr(4,2); if (month > 12 || day > 31) { alert("Fyll i korrekt personnummer"); kontakt.pnr.style.background = "red"; return false; } else { return true; } } else { alert("Fyll i personnummer i formatet xxxxxx-xxxx"); kontakt.pnr.style.background = "red"; return false; } var an = /^[0-9]{5}$/; var a = document.forms.kontakt.posnr.value; if (!a.match(an) ) { alert("Fyll i ett korrekt postnummer!"); kontakt.posnr.style.background = "Red"; return false; } var eo = /^[0-9]/;r var e = document.forms.kontakt.ort.value; if (e==null || e=="" || e.match(eo) ) { alert("Fyll i ort!"); kontakt.ort.style.background = "red"; return false; } } </script>

Så här långt har jag kommit med mitt script, men måste ha gjort nå fel nu för efter att jag lägger in ett korrekt namn enligt kriterierna så blir resten automatiskt validerat även fast dom saknar värde... har jag missat nån klammer eller dylikt?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av ajp_anton:

Om du använder 4-siffrigt år:

if ( month>12 || day>31 || ((month<7&&month%2==0)||(month>8&&month%2==1))&&day>30 || (month==2 && (day>29 || ((year%4||!(year%100))&&year%400 && day>28))) )

Om 2-siffrigt år, antar att 00 är 2000:

if ( month>12 || day>31 || ((month<7&&month%2==0)||(month>8&&month%2==1))&&day>30 || (month==2 && (day>29 || (year%4 && day>28))) )

Använd på egen risk, kan ha missat nån siffra här och en parentes där.

snajsigt ska kolla in det när jag får ordning på hela scriptet

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Att validera personnummer är rätt krångligt faktiskt. Datumet måste stämma; 880231-1234 är fel eftersom det inte finns något 31 februari. Sista siffran är en kontrollsiffra som räknas fram enligt en formel; om den inte stämmer överens med resultatet av formeln är personnumret inte heller korrekt.

Nedanstående kod når ganska långt (den validerar kontrollsiffran och att datumet är ok) men vissa specialfall tas inte i åtanke.

function isValidPersonnummer(str) { var pattern = /^(\d\d)(\d\d)(\d\d)[+-](\d\d\d)(\d)$/, data = pattern.test(str) && createObject( ['year', 'month', 'day', 'födelsenummer', 'checksum'], str.match(pattern).splice(1) ), isoDate = '19' + [data.year, data.month, data.day].join('-') return data && isValidIsoDate(isoDate) && validateChecksum(data) function createObject(keys, values) { var i, res = {} for (i=0; i<keys.length; i++) { res[keys[i]] = values[i] } return res } function isValidIsoDate(str) { var pattern = /\d{4}-\d{2}-\d{2}/, date = new Date(str) return !isNaN(date) && date.toISOString().substring(0, 10) === str } function validateChecksum(data) { var numbers = data.year + data.month + data.day + data.födelsenummer function calc(rest, m) { var product = parseInt(rest[0]) * (m % 2 + 1), value = Math.floor(product / 10) + product % 10 return rest.length && calc(rest.splice(1), m + 1) + value } return 10 - calc(numbers.split(''), 1) % 10 === parseInt(data.checksum) } }

Dold text
Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Att validera personnummer är rätt krångligt faktiskt. Datumet måste stämma; 880231-1234 är fel eftersom det inte finns något 31 februari. Sista siffran är en kontrollsiffra som räknas fram enligt en formel; om den inte stämmer överens med resultatet av formeln är personnumret inte heller korrekt.

Nedanstående kod når ganska långt (den validerar kontrollsiffran och att datumet är ok) men vissa specialfall tas inte i åtanke.

function isValidPersonnummer(str) { var pattern = /^(\d\d)(\d\d)(\d\d)[+-](\d\d\d)(\d)$/, data = pattern.test(str) && createObject( ['year', 'month', 'day', 'födelsenummer', 'checksum'], str.match(pattern).splice(1) ), isoDate = '19' + [data.year, data.month, data.day].join('-') return data && isValidIsoDate(isoDate) && validateChecksum(data) function createObject(keys, values) { var i, res = {} for (i=0; i<keys.length; i++) { res[keys[i]] = values[i] } return res } function isValidIsoDate(str) { var pattern = /\d{4}-\d{2}-\d{2}/, date = new Date(str) return !isNaN(date) && date.toISOString().substring(0, 10) === str } function validateChecksum(data) { var numbers = data.year + data.month + data.day + data.födelsenummer function calc(rest, m) { var product = parseInt(rest[0]) * (m % 2 + 1), value = Math.floor(product / 10) + product % 10 return rest.length && calc(rest.splice(1), m + 1) + value } return 10 - calc(numbers.split(''), 1) % 10 === parseInt(data.checksum) } }

Dold text

Oooh tusen tack kan du kolla mitt förgående inlägg? jag fattar verkligen inte vart felet sitter?! kollat med jslint men får inga error...

finns det nått sätt att köra script och kolla vars felet sitter? för efter jag skriver in ett korrekt namn så skiter det i att validera dom andra inputarna

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Fundera på vad som händer när namnet är "valid". Vad gör return?

Skrivet av pellski87:

if (n.match(ns)) { return true; // <---- här alltså. }

Så här långt har jag kommit med mitt script, men måste ha gjort nå fel nu för efter att jag lägger in ett korrekt namn enligt kriterierna så blir resten automatiskt validerat även fast dom saknar värde... har jag missat nån klammer eller dylikt?

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

Fundera på vad som händer när namnet är "valid". Vad gör return?

Tack ;> men vad ska man ha istället för return true; ? funkar då jag tar bort det men inte om jag tar bort måsvingarna för den strängen

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Måsvingarna symboliserar ju ett sammanhängande block av kod. Tar man bort måsvingarna och man har exempelvis en if, så får man ett implicit kodblock som består av raden (eller snarare uttrycket) som följer direkt efter if-satsen.

ex:

if (x == y) { console.log("Explicit kodblock"); } if (x == y) console.log("Implicit kodblock som hör till raden ovanför"); if (x == y) console.log("Implicit kodblock på samma rad");

Om du tar bort både "return" och måsvingarna, så kommer koden att tolkas som att else skall köras om if är sant. Detta går inte rent logiskt och kommer därför att resultera i ett fel.

if (x == y) else { // <-- Detta kommer alltså tolkas som att "else" skall köras om if är sant. => Computer says "No". }

För att återgå till ditt egentliga problem, så kanske det är enklast att du använder en variabel för att hålla reda på om du påträffat något fel eller inte.

Pseudokod:

var hasError = false; if (namn inte är valid) { hasError = true; // Annat stuff... } if (personnummer inte är valid) { hasError = true; // Annat stuff... } // Osv för dina andra fält. if (hasError) { // Något är fel, meddela användaren. } else { // Gör något som skall göras om allt är ok (kanske return?) }

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Antingen validerar du dem sekventiellt och ger fel på första felaktiga input och fortsätter validera nästa gång man skickar formuläret. Det kan vara struligt för användaren om det är mycket fel. Så ofta kollar du alla och sparar undan vilka som är fel och returnerar sist.

Permalänk
Medlem
Skrivet av jovnas:

Måsvingarna symboliserar ju ett sammanhängande block av kod. Tar man bort måsvingarna och man har exempelvis en if, så får man ett implicit kodblock som består av raden (eller snarare uttrycket) som följer direkt efter if-satsen.

ex:

if (x == y) { console.log("Explicit kodblock"); } if (x == y) console.log("Implicit kodblock som hör till raden ovanför"); if (x == y) console.log("Implicit kodblock på samma rad");

Om du tar bort både "return" och måsvingarna, så kommer koden att tolkas som att else skall köras om if är sant. Detta går inte rent logiskt och kommer därför att resultera i ett fel.

if (x == y) else { // <-- Detta kommer alltså tolkas som att "else" skall köras om if är sant. => Computer says "No". }

För att återgå till ditt egentliga problem, så kanske det är enklast att du använder en variabel för att hålla reda på om du påträffat något fel eller inte.

Pseudokod:

var hasError = false; if (namn inte är valid) { hasError = true; // Annat stuff... } if (personnummer inte är valid) { hasError = true; // Annat stuff... } // Osv för dina andra fält. if (hasError) { // Något är fel, meddela användaren. } else { // Gör något som skall göras om allt är ok (kanske return?) }

Skrivet av jocke92:

Antingen validerar du dem sekventiellt och ger fel på första felaktiga input och fortsätter validera nästa gång man skickar formuläret. Det kan vara struligt för användaren om det är mycket fel. Så ofta kollar du alla och sparar undan vilka som är fel och returnerar sist.

Thanks for shedding some light försöker lära mig det här, alltid kul att träffa på folk som är villiga att förklara lite!

Visa signatur

Citera om du vill ha svar :)