Prøv at indsætte denne kodeblok i head-sektionen på et rent HTML-dokument og se om funktionen ikke lever op til dine krav (du kan evt. selv oprette flere tests, som kalder med andre værdisæt du ønsker at teste):
<script type="text/javascript">
function validatePrisinterval(nIn,mIn) {
debug("(nIn: " + nIn + ", mIn: " + mIn + ") ");
// sæt standardværdier for tomme intervalgrænser
if (nIn == "") { nIn = "0"; }
if (mIn=="") { mIn="2000000000"; }
// undersøg om til og fra priserne er tal
var isNumber = /^\d+(,\d*){0,1}$/;
if (!isNumber.test(nIn)) return false;
if (!isNumber.test(mIn)) return false;
// omsæt strengene til reelle tal
var n = parseFloat(nIn.replace(/,/,"."), 10);
var m = parseFloat(mIn.replace(/,/,"."), 10);
debug("n: " + n + ", m: " + m + " => ");
// undersøg om tallene ligger indenfor de gyldige grænseværdier
if (n > m) return false;
return true;
}
// UNITTESTS!!!
// intervaller som burde give fejl
testFn(!validatePrisinterval("", "-1"));
testFn(!validatePrisinterval("0", "-1"));
testFn(!validatePrisinterval("950", "200"));
testFn(!validatePrisinterval("alfa1", "alfa2"));
// intervaller som burde være gyldige
testFn(validatePrisinterval("", ""));
testFn(validatePrisinterval("0", "1"));
testFn(validatePrisinterval("10", ""));
testFn(validatePrisinterval("10,010", ""));
testFn(validatePrisinterval("10,010", "432,19"));
// funktion der udskriver tekst i browseren
function debug(txt) {
document.write(txt);
}
// funktion der giver en tilbagemelding på testen
function testFn(fnRes) {
fnRes ? debug("OK<br>") : debug("FEJLEDE<br>");
}
</script>
Såvidt jeg kan se har du flg. problemer med din kode:
* match findes ikke på et strengobjekt (som standard)
* dit regulære udtryk er ikke korrekt
* du arbejder kun med strenge og strengsammenligning, hvilket kan give nogle udfordringer ifht. værdisammenligninger
Jeg har derfor lavet et regulært udtryk der gemmes i
isNumber i stedet. På det regulære udtryk kan funktionen test kaldes. Denne tager en streng som parameter og returnerer true hvis strengens indhold matcher udtrykket, ellers returneres false.
Jeg har desuden valgt at arbejde med streng- og tal-variabler i stedet for at arbejde direkte på strengene hele vejen igennem. Jeg omsætter først strengene til tal efter jeg har valideret dem med det regulære udtryk og dermed burde være sikker på at det er tal der findes i strengene.
Til sidst har jeg flyttet fejlrapporteringsansvaret udenfor valideringsfunktionen, så funktionen kun har et formål, nemlig at validere parametre. Du kan evt. pakke kaldet til validatePrisinterval ind i en anden funktion som sørger for at fejlmelde hvis resultatet af valideringen ikke er tilfredsstillende. F.eks. således:
function validateForm() {
var fra = document.SearchForm.Pris_fra.value;
var til = document.SearchForm.Pris_til.value;
if(!validatePrisinterval(fra,til)) {
alert("Fejl: Prisintervallet er ikke korrekt udfyldt!");
return false;
}
return true;
}
Jeg har, som nævnt i starten, lavet et sæt testcases, dvs. funktioner der undersøger forskellige inputværdiers påvirkning af funktionens returværdi. Dette er et helt simpelt testsetup, som kan gøres meget mere avanceret, men det giver i det mindste en mulighed for at lave nogle tests, som nemt kan gentages. Når du har et sæt tests stablet på benene, kan du med mindre risiko justere (refactor) koden i din funktion uden større risiko for at introducere nye fejl, da alle dine tests jo gerne skulle fortsætte med at returnere OK, selvom du retter i koden.
NB: Du skal naturligvis fjerne kald til debug-funktionen inden du rykker koden over i produktionsmiljøet, men det havde du nok gættet...