Varför kontrollera längden när det felet ändå upptäcks i och med kontrollen av huruvida http:// inleder denna. Längdkollen gjorde att if/else-loopen lämnades för tidigt i vissa fall. Jag rekommenderar följande kod (notera att även felmeddelandet ändrats!)
function checkboxcheck(obj,name){
var nn=0;
for(var n=0;n<obj.length;n++){
nn+=(obj[n].type=="checkbox"&&obj[n].checked&&(!name||name==obj[n].name))?1:0;
}
return(nn);
}
function UpdateRest(){
var elm = document.forms["form"].elements;
if (document.form.namn.value==""){
alert("Du glömde restaurangens namn!");
return false;
} else if (document.form.adress.value==""){
alert("Du glömde skriva restaurangens adress!");
return false;
} else if (document.form.husnr.value==""){
alert("Du glömde skriva restaurangens husnr!");
return false;
} else if (document.form.tel.value==""){
alert("Du glömde skriva restaurangens telefonnummer!");
return false;
} else if (!/^http:\/\//.test(elm["www"].value)) {
alert("Hemsideadressen måste fyllas i samt börja med [url]http://[/url]");
return false;
} else if (document.form.postnr.value==""){
alert("Du glömde skriva restaurangens postnr!");
return false;
} else if (document.form.ort.value==""){
alert("Du glömde skriva restaurangens ort!");
return false;
} else if (checkboxcheck(document.forms["form"],"kID") > 2){
alert("Du får max markera 2 kategorier.");
return false;
}
// Tag bort nästa rad. Den finns där endast i testsyften
alert("ok");
}
Då ska den kollen inte finnas i else if-kedjan för att undvika att lämna kollen för tidigt. Kod som följer:
function checkboxcheck(obj,name){
var nn=0;
for(var n=0;n<obj.length;n++){
nn+=(obj[n].type=="checkbox"&&obj[n].checked&&(!name||name==obj[n].name))?1:0;
}
return(nn);
}
function UpdateRest(){
var elm = document.forms["form"].elements;
if (document.form.namn.value==""){
alert("Du glömde restaurangens namn!");
return false;
} else if (document.form.adress.value==""){
alert("Du glömde skriva restaurangens adress!");
return false;
} else if (document.form.husnr.value==""){
alert("Du glömde skriva restaurangens husnr!");
return false;
} else if (document.form.tel.value==""){
alert("Du glömde skriva restaurangens telefonnummer!");
return false;
} else if (document.form.postnr.value==""){
alert("Du glömde skriva restaurangens postnr!");
return false;
} else if (document.form.ort.value==""){
alert("Du glömde skriva restaurangens ort!");
return false;
} else if (checkboxcheck(document.forms["form"],"kID") > 2){
alert("Du får max markera 2 kategorier.");
return false;
}
if (!document.form.[url]www.value==[/url]"" && !/^http:\/\//.test(elm["www"].value)) {
alert("Hemsideadressen måste börja med [url]http://[/url]");
return false;
}
// Tag bort nästa rad. Den finns där endast i testsyften
alert("ok");
}
Asa, du har inget annat (html)-fel på sidan? Jag provade din kod och den verkar fungera ok (ditt exempel).
Hurvida du returnerar false som i ditt exempel eller nitro's spelar ingen roll. Det blir inte mer false bara för att det är fler saker som är fel :) Det man skulle kunna göra är att summera alla saker som är fel istället för att returnera false så fort man hittar något. På så vis kan man tala om för användaren alla saker som inte stämmer istället för att bara rapportera ett och ett.
Nja jojoxx, koden orsakar inga körfel, om formens element finns. Däremot orsakar koden(den ursprungliga) ett logiskt fel, nämligen att den inte upptäcker inte skrivit i postnr, ort eller om denne markerat fler än 2 kategorier (Dock bara om användaren skrivit in en korrekt www). Men för att jag är så snäll :) så har jag skrivit i ordning en kod som kollar varje element för sig.
function UpdateRest(){
var elm = document.forms["form"].elements;
var errNums = 0;
var errors = "Följande fel upptäcktes: \n\n";
if (document.form.namn.value==""){
errors += "Du glömde restaurangens namn!" + "\n";
errNums ++;
}
if (document.form.adress.value==""){
errors += "Du glömde skriva restaurangens adress!" + "\n";
errNums ++;
}
if (document.form.husnr.value==""){
errors += "Du glömde skriva restaurangens husnr!" + "\n";
errNums ++;
}
if (document.form.tel.value==""){
errors += "Du glömde skriva restaurangens telefonnummer!" + "\n";
errNums ++;
}
if (document.form.postnr.value==""){
errors += "Du glömde skriva restaurangens postnr!" + "\n";
errNums ++;
}
if (document.form.ort.value==""){
errors += "Du glömde skriva restaurangens ort!" + "\n";
errNums ++;
}
if (checkboxcheck(document.forms["form"],"kID") > 2){
errors += "Du får max markera 2 kategorier." + "\n";
errNums ++;
}
if (!document.form.[url]www.value==[/url]"" && (!/^http:\/\//.test(elm["www"].value))) {
errors += "Hemsideadressen måste börja med [url]http://[/url]" + "\n";
errNums ++;
}
if (errNums > 0)
alert (errors);
return false;
else
// Tag bort nästa rad. Den finns där endast i testsyften
alert("ok");
}
Asa, du har inget annat (html)-fel på sidan? Jag provade din kod och den verkar fungera ok (ditt exempel).
Hurvida du returnerar false som i ditt exempel eller nitro's spelar ingen roll. Det blir inte mer false bara för att det är fler saker som är fel :) Det man skulle kunna göra är att summera alla saker som är fel istället för att returnera false så fort man hittar något. På så vis kan man tala om för användaren alla saker som inte stämmer istället för att bara rapportera ett och ett.
I det exemplet finns ju inte checkboxarna med. Det ska finnas flera såna och 2 får max fyllas i. De heter lika med olika värden.
Däremot orsakar koden(den ursprungliga) ett logiskt fel
Har Asa redigerat sitt inlägg eller syftar du på något annat? Denna kodsnutt släpper inte igenom ett icke ifyllt postnummerfält.
Nej däremot har jag redigerat mitt inlägg... Jag glömde nämligen att nämna detta först: Den släpper bara igenom postnr och ort om url-en är korrekt ifylld. (Pröva det!). Om man fyller i en felaktig url eller lämnar den tom fungerar koden som man förväntar sig, men som sagt inte om url är korrekt ifylld.
Du använder förmodligen ASP på sidan du tar emot formuläret?!
Tips: Låt de få skriva "som de vill" i formuläret (www) och plocka bort "http://" ur strängen, så kan du enkelt sätta dit det igen innan du lägger till adressen. Eller tänker jag fel?