11. maj 2005 - 11:38Der er
34 kommentarer og 2 løsninger
disable felter i andre dropdownbokse med tilsvarende værdi
Hejsa,
Har en række dropdownbokse - alle med ens options.
Vælger du noget i en af dem, skal den tilsvarende værdi i de andre bokse, blive disabled.
Har rodet med det man kan ikke få det til at virke - kun med en 'statisk måde' - hvor jeg er nødt til at vide hvor mange bokse der er osv., men dette kan variere.
du kan gøre sådan her ---- <script> function disable(select){ var selects = document.forms.form1.elements var indeks = select.selectedIndex for(i=0;i<selects.length;i++){ if (selects[i] != select){ selects[i].options[indeks].disabled = true; } } } </script>
Det eneste det kræver er at du har et id eller navn på din form Du bør nok overveje om du ønsker at de ikke skal kunne enables igen Altså hvis man i den første vælger "2" så bliver den disapled i de to andre .. Men hvis nu man fortryder og så i den første vælger "1". så som det er nu så forbliver "2" disabled i de to andre
De 2 andre skal følge med - så det er den nye værdi der bliver låst hvis man skifter værdi i den første.
Forresten fik jeg vist ikke nævnt, at der er nogle felter (overskrifter til opdelinger) - disse skal ikke låse noget når man vælger dem. De kan genkendes på value="0".
Lidt omstændigt men det her gør det i alt fald vil jeg mener --- <script> function disable(select){ nulstil(); var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects.length;j++){ if(i != j && selects[i].selectedIndex != 0){ selects[j].options[selects[i].selectedIndex].disabled = true; } } } } function nulstil(){ var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects[i].options.length;j++){ selects[i].options[j].disabled = false; } } } </script>
lidt forklaring måske Når du vælger en option så kaldes funktionen disaple() Den kalder først funktionen nulstil() som nulstiller alle selects Dernæst løber den alle selects igennem og for hver løber den igen alle igennem og sætter de enkelte som disabled :o) Så faktisk behøver den ikke kaldes med this...sådan her gøre det samme: --- <script> function disable(){ nulstil(); var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects.length;j++){ if(i != j && selects[i].selectedIndex != 0){ selects[j].options[selects[i].selectedIndex].disabled = true; } } } } function nulstil(){ var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects[i].options.length;j++){ selects[i].options[j].disabled = false; } } } </script>
Har du testet det? Jeg har prøvet dit eksempel direkte via copy/paste - men der synes ikke at ske noget som helst når man vælger en værdi i en dropdown. Får ingen fejl heller.
Jeg har lige prøvet at sætte en til disabled selv sådan her -- <select id="select3" onchange="disable();"> <option value="0">nul</option> <option value="1">et</option> <option value="2">to</option> <option value="3" disabled>tre</option> </select> -- Det virker i FF men ikke i IE. Jeg vil tro det er fordi IE ikke er oppe på dupperne desværre :o(
Men det er jo så såre simpelt Hvis ikke IE og Opera tolker disbled korrekt Så må du desværre enten undvære funktionaliteten eller overveje lave det på en helt anden måde. :( surt
Ja det er så det ...har lige prøvet sådan her --- <head> <script> function disable(){ nulstil(); var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects.length;j++){ if(i != j && selects[i].selectedIndex != 0){ selects[j].options[selects[i].selectedIndex].style.display = 'none'; } } } } function nulstil(){ var selects = document.forms.form1.elements for(i=0;i<selects.length;i++){ for(j=0;j<selects[i].options.length;j++){ selects[i].options[j].style.display = 'block'; } } } </script> </head> <body> <form id="form1"> <select id="select1" onchange="disable();"> <option value="0">nul</option> <option value="1">et</option> <option value="2">to</option> <option value="3">tre</option> </select> <select id="select2" onchange="disable();"> <option value="0">nul</option> <option value="1">et</option> <option value="2">to</option> <option value="3">tre</option> </select> <select id="select3" onchange="disable();"> <option value="0">nul</option> <option value="1">et</option> <option value="2">to</option> <option value="3">tre</option> </select> </form> </body> -- Altså så de bliver stylet til none.... Men det virker sku også kun i FF... arghh
eneste alternativ løsning jeg har er hvis du laver det i asp eller php så lægge selects i en form som du ved en onchange autosubmitter og ud fra det så i php eller asp genskriver selectsne med de nye værdier... omstændigt Alternativt - fortæl dine brugere at de skal bruge FF... Nok ikke en heldig løsning
Jeg laver det i php, ja. Men det skal være javascript. Både for brugervenligheden og fordi der også sker en masse andre ting i javascript, som ikke må glemmes ved redirect.
Det er en lille editor ser du, hvor man kan drag n' drop'e nogle ting ind og sammensætte sin forside i en webshop. Samt en masse andet...så en php løsning vil ikke du :)
Bliver tosset snart :o(... Ovenstående virker perfekt i FF hos mig. I IE giver det en "udefineret fejl" hvis jeg i første select vælger 1, i anden 2, i tredie 3 og så i anden vælger nul. Den kommer kun engang imellem når jeg vælger nul, og beskrivelse "udefineret fejl" hvad er det for noget IE gylle :o(.. Den kommer i linjen selects[i].options[j].selected = true; Hvis jeg ovenover den linje sætter en alert("hejsa") ... så virker det også fint i IE Så det fatter jeg nada af Troede ellers lige jeg havde et godt bud der.. prøv evt om din IE brokker sig eller om det kun er min... :o(
Tjah, der er jo mange krøller, der skal krølles udenom, men f.eks. sådan, hvor udgangspunktet har været standard-tingen, at man har en nul-option for at være sikker på, at chnage virkelig sker:
<script type="text/javascript"> var selValues = new Array(),selectedVals = new Array(); selValues[0] = new Array,selValues[1] = new Array; window.onload = function(){ var f = document.forms[0]; var sels = f.getElementsByTagName("SELECT"); for(i=0;sels.length>i;i++){ if(selValues[0].length==0 && sels[i].name.indexOf('select')==0){//kigger kun på selects, hvis navn starter på 'select' for(j=1;sels[i].length>j;j++){ selValues[0][j] = sels[i].options[j].value; selValues[1][j] = sels[i].options[j].text; } } selectedVals[i] = -1; } } function disable(sel){ var actIndex = sel.selectedIndex; var actVal = sel.value; var f = sel.form; var sels = f.getElementsByTagName("SELECT"); for(i=0;sels.length>i;i++){ if(sels[i] == sel){ selectedVals[i] = actVal; } } var found = false,actSel="",newOpt=null,selNum=1; for(i=0;sels.length>i;i++){ if((sels[i] != sel || sel.selectedIndex == 0) && sels[i].name.indexOf('select')==0){ actSel = sels[i].value; sels[i].length = 1; selNum = 1; for(j=1;selValues[0].length>j;j++){ found = false; for(k=1;selectedVals.length>k;k++){ found = found || (selectedVals[k] == selValues[0][j] && k != i); } if(!found){ newOpt = new Option(selValues[1][j],selValues[0][j]); sels[i].options[selNum++] = newOpt; } if(selValues[0][j] == actSel) sels[i].selectedIndex = sels[i].length-1; } } } } </script>
-- ikke andet end at vise, at jeg indrettet tingen til at virke selvom du har andre selects i din form, og så var metode en rimelig mulighed for at have brug for flere !-)
Hrm, jeg havde fået lavet en blunder lige der (og opdagede så, at evt. ekstra selects ikke må have værdier i den initielt valgte, som går igen i de andre selects !-)
Jeg har lige oprettet et spørgsmål angående dette, hvor jeg har udloddet lidt flere points til en videreudvikling af roenving's script. Jeg håber, I vil tage et kig på spørgsmålet:
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.