Avatar billede kagge Nybegynder
21. oktober 2003 - 09:42 Der er 11 kommentarer og
2 løsninger

Validering: selectmenu valg må ikke være ens

Hvordan validerer man bedst muligt nedenstående eksempel: Jeg har 5 ens select-menuer (samme indhold). Hvis man vælger 1 i en af dem må man ikke vælge 1 i en anden osv. (de må gerne være tomme alle sammen). Der skal altså komme en alert, når brugeren har lavet 2 ens valg

function validering(frm) {

??
??

}

<form name="kaj" onSubmit="return validering(this)" action="xxx.asp" method="post">

<SELECT NAME="test1">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test2">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test3">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test4">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test5">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>
Avatar billede erikjacobsen Ekspert
21. oktober 2003 - 09:53 #1
Sådan ?



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> ... </title>
<meta name="Generator" content="Human intelligence">
</head>

<body>
<script>
function validering(frm) {
  var v = new Array();
v[1]=frm.test1[frm.test1.selectedIndex].value;
v[2]=frm.test2[frm.test2.selectedIndex].value;
v[3]=frm.test3[frm.test3.selectedIndex].value;
v[4]=frm.test4[frm.test4.selectedIndex].value;
v[5]=frm.test5[frm.test5.selectedIndex].value;

var a = new Array();
for (i=1;i<=5;i++) {
  if (v[i]!="" && a[v[i]]) {
    alert(v[i]+" valgt mere end een gang");
    return false; }
  a[v[i]]=1;
}
  return true;

}
</script>

<form name="kaj" onSubmit="return validering(this)" action="xxx.asp" method="post">

<SELECT NAME="test1">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test2">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test3">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test4">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>

<SELECT NAME="test5">
  <OPTION VALUE=""></OPTION>
  <OPTION VALUE="1">1</OPTION>
  <OPTION VALUE="2">2</OPTION>
  <OPTION VALUE="3">3</OPTION>
  <OPTION VALUE="4">4</OPTION>
  <OPTION VALUE="5">5</OPTION>
</SELECT>
<input type="submit">
</form>
</body>
</html>
Avatar billede roenving Novice
21. oktober 2003 - 09:56 #2
Em anelse anderledes tilgang, men ellers skulle eriks vel virke perfekt !-)

<script type="text/javascript">
function validering(frm) {
c = new Array();
for(var i=1;5>=i;i++){
c[i] = frm.elements['test'+i].value;
}
for(i=1;5>i;i++){
    for(j=i+1;5>=j;j++){
        if(c[i]==c[j]&&c[i]!=""){
            alert('Der må ikke være valgt ens værdier!\n\nPrøv igen !-)')
            return false;
        }
    }
}
return true;
}
</script>
Avatar billede kagge Nybegynder
21. oktober 2003 - 10:13 #3
Jeg har fået det til at virke med Ericjacobsens løsning, men umiddelbart ser det også ud til at dit vil fungere.

Ericjacobsen vil du lige lægge et svar og tusind tak for hjælpen og til roenving tak for dit forslag (det er altid rart at se forskellige løsningsmuligheder på det samme problem) :)
Avatar billede erikjacobsen Ekspert
21. oktober 2003 - 10:16 #4
Hvis der var mere end 5 valg ville roenvings være langsom (5*5 gennemløb
af checket), mens min med arrays vil være hurtigere. Men med 5 er det
ligemeget. Du kan evt stjæle roenvings første for-løkke, og give ham lidt
krummer i belønning ;))
Avatar billede kagge Nybegynder
21. oktober 2003 - 10:17 #5
roenving kan du ikke også lige lægge et svar så får du lidt krummer :)
Avatar billede roenving Novice
21. oktober 2003 - 10:24 #6
Oki ...

-- og velbekomme '-)
Avatar billede roenving Novice
21. oktober 2003 - 10:25 #7
Forøvrigt giver min løkke ikke 25 gennemløb, men 10 !-)

K n,r ...
Avatar billede kagge Nybegynder
21. oktober 2003 - 10:26 #8
fino
Avatar billede erikjacobsen Ekspert
21. oktober 2003 - 10:26 #9
Ok, men (n^2)/2 ca. og det er O(n^2), hvor min bliver O(n)
Avatar billede roenving Novice
21. oktober 2003 - 10:30 #10
Ja, jeg var bevidst om, at den første kun tæller fra 1 til 4 og den anden fra i+1 til 5, da resten jo ville være overflødigt, men du har selvfølgelig ret i, at det ikke burde være nødvendigt at checke samtlige kombinationer, når man kan nøjes med at checke hver box op mod en samlet ting !-)

-- og tak for points ;~}
Avatar billede kagge Nybegynder
21. oktober 2003 - 10:50 #11
Hvorfor virker det ikke når jeg også laver det for en anden Selectmenu-gruppe? Kan det være noget med returneringen af true eller false.

var k = new Array();
k[1]=frm.kvalifikation1[frm.kvalifikation1.selectedIndex].value;
k[2]=frm.kvalifikation2[frm.kvalifikation2.selectedIndex].value;
k[3]=frm.kvalifikation3[frm.kvalifikation3.selectedIndex].value;
k[4]=frm.kvalifikation4[frm.kvalifikation4.selectedIndex].value;
k[5]=frm.kvalifikation5[frm.kvalifikation5.selectedIndex].value;

var b = new Array();
for (c=1;c<=5;c++) {
if (k[c]!="" && b[k[c]]) {
alert("Den samme kvalifikation kan ikke vælges mere end 1 gang.");
return false; }
b[k[c]]=1;
}
return true;
   
var u = new Array();
u[1]=frm.uddannelse1[frm.uddannelse1.selectedIndex].value;
u[2]=frm.uddannelse2[frm.uddannelse2.selectedIndex].value;
u[3]=frm.uddannelse3[frm.uddannelse3.selectedIndex].value;
u[4]=frm.uddannelse4[frm.uddannelse4.selectedIndex].value;
u[5]=frm.uddannelse5[frm.uddannelse5.selectedIndex].value;
u[6]=frm.uddannelse6[frm.uddannelse6.selectedIndex].value;
u[7]=frm.uddannelse7[frm.uddannelse7.selectedIndex].value;
u[8]=frm.uddannelse8[frm.uddannelse8.selectedIndex].value;
u[9]=frm.uddannelse9[frm.uddannelse9.selectedIndex].value;
u[10]=frm.uddannelse10[frm.uddannelse10.selectedIndex].value;

var d = new Array();
for (e=1;e<=10;e++) {
if (u[e]!="" && d[u[e]]) {
alert("Den samme uddannelse kan ikke vælges mere end 1 gang.");
return false; }
d[u[e]]=1;
}
return true;
Avatar billede erikjacobsen Ekspert
21. oktober 2003 - 10:58 #12
Fjern den første
  return true;
Avatar billede kagge Nybegynder
21. oktober 2003 - 11:32 #13
takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester