Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][JavaScript]Zależne pola select - jak ukryć niepotrzebne
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam, mam problem jak w temacie
Wybieram element z pierwszego selecta, w zależności od wyboru pokazuje mi zawartość w drugim, wybieram w drugim pokazuje wybrane w trzecim.
Może być sytuacja że wybieram w pierwszym i na tym koniec, podobnie w drugim.Jak pokazzywać selekty w razie potrzeby?


  1. <form method="post" action="" name="tripleplay" >
  2. ........
  3. <label for="Select2">Rodzaj </label>
  4. <select name='List1' onchange="fillSelect(this.value,this.form['List2'])" class="form-control">
  5. <option selected>Wybierz rodzaj</option>
  6. </select>
  7. </div>
  8. <div class="form-group" >
  9. <label for="Select2">Dane dodatkowe</label>
  10. <select name='List2' onchange="fillSelect(this.value,this.form['List3'])" class="form-control">
  11. <option selected></option>
  12. </select>
  13. </div>
  14. <div class="form-group" >
  15. <label for="Select3">Opcje</label>
  16. <select name='List3' onchange="getValue(this.value, this.form['List2'].value,this.form['List1'].value)" class="form-control">
  17. <option selected ></option>
  18. </select>
  19. </div>
  20. .......
  21. </form>
  22.  
  23.  
  24. <script type="text/javascript">
  25.  
  26. var categories = [];
  27. categories["startList"] = ["1","2","3"]
  28. categories["2"] = ["a","b","c","d","e","f","g"];
  29. categories["3"] = ["x","y"];
  30. categories["e"] = ["e1","e2","e3","e4","e5","e6","e7"];
  31.  
  32. var nLists = 3; // number of select lists in the set
  33.  
  34. function fillSelect(currCat,currList){
  35. var step = Number(currList.name.replace(/\D/g,""));
  36. for (i=step; i<nLists+1; i++) {
  37. document.forms['tripleplay']['List'+i].length = 1;
  38. document.forms['tripleplay']['List'+i].selectedIndex = 0;
  39. }
  40. var nCat = categories[currCat];
  41. for (each in nCat) {
  42. var nOption = document.createElement('option');
  43. var nData = document.createTextNode(nCat[each]);
  44. nOption.setAttribute('value',nCat[each]);
  45. nOption.appendChild(nData);
  46. currList.appendChild(nOption);
  47. }
  48. }
  49.  
  50. function getValue(L3, L2, L1) {
  51. alert("Your selection was:- \n" + L1 + "\n" + L2 + "\n" + L3);
  52. }
  53.  
  54. function init() {
  55. fillSelect('startList',document.forms['tripleplay']['List1'])
  56. }
  57.  
  58. navigator.appName == "Microsoft Internet Explorer" ? attachEvent('onload', init, false) : addEventListener('load', init, false);
  59.  
  60.  

trueblue
Jeśli są jakieś wartości dla <select>, a dokładnie tworzące <option>, to włącz wyświetlanie tej listy i kolejnej, jeśli brak, to wyłącz.
Domyślnie wszystkie począwszy od drugiej wyłączone.
Wyłączanie poprzez style.display = 'none' lub nadawanie/odejmowanie klasy (https://developer.mozilla.org/pl/docs/Web/API/Element/classList).
krzesik
słabo się czuję w JS, moższ mi w tym pomóc?

mam teraz coś takiego, ale to coś mi dalej nie działa....

  1.  
  2. <script type="text/javascript">
  3. .......
  4. function getValue(L3, L2, L1) {
  5. alert("Your selection was:- \n" + L1 + "\n" + L2 + "\n" + L3);
  6.  
  7. document.getElementById("mydiv2").style.display="none";
  8. document.getElementById("mydiv3").style.display="none";
  9.  
  10. if (L1 == "2") {
  11. document.getElementById("mydiv2").style.display="block";
  12. }
  13. if (L1 == "3") {
  14. document.getElementById("mydiv3").style.display="block";
  15.  
  16. }
  17. }
  18. ....................
  19.  
  20. <form method="post" action="" name="tripleplay" >
  21. ........
  22. <label for="Select2">Rodzaj </label>
  23. <select name='List1' onchange="fillSelect(this.value,this.form['List2'])" class="form-control">
  24. <option selected>Wybierz rodzaj</option>
  25. </select>
  26. </div>
  27. <div class="form-group" id="mydiv2" style="display:none">
  28. <label for="Select2">Dane dodatkowe</label>
  29. <select name='List2' onchange="fillSelect(this.value,this.form['List3'])" class="form-control">
  30. <option selected></option>
  31. </select>
  32. </div>
  33. <div class="form-group" id="mydiv3" style="display:none">
  34. <label for="Select3">Opcje</label>
  35. <select name='List3' onchange="getValue(this.value, this.form['List2'].value,this.form['List1'].value)" class="form-control">
  36. <option selected ></option>
  37. </select>
  38. </div>
  39. .......
  40. </form>
  41.  
  42.  
  43.  
trueblue
Co ma pomóc funkcja podpięta w ostatnim <select>, będziesz wyłączał poprzednie listy?

Skoro wypełniasz w funkcji fillSelect wybraną listę, to wiesz w tym momencie czy ma elementy czy nie. Zależnie od tego wyłączasz i włączasz kolejne listy.
krzesik
Oczywiście że nie chcę wyłączać poprzednich wyborów, ale na tą chwilę widzę tylko pierwszy select i bez względu co wybieram za skarby narodów kolejne mi się nie pokazują........
trueblue
A które miejsce w Twoim kodzie odpowiada za pokazywanie kolejnych list?
krzesik
Tworzenie

  1. for (each in nCat) {
  2. var nOption = document.createElement('option');
  3. var nData = document.createTextNode(nCat[each]);
  4. nOption.setAttribute('value',nCat[each]);
  5. nOption.appendChild(nData);
  6. currList.appendChild(nOption);
  7. }


wyświetlanie
  1. function fillSelect(currCat,currList){
  2. var step = Number(currList.name.replace(/\D/g,""));
  3. for (i=step; i<nLists+1; i++) {
  4. document.forms['tripleplay']['List'+i].length = 1;
  5. document.forms['tripleplay']['List'+i].selectedIndex = 0;
  6. }
trueblue
Pokazywanie - zmiana styli, nie tworzenie. Gdzie jest ten fragment? Jak znajdziesz, to pomyśl czy w dobrym miejscu
krzesik
w tym miejscu generujemy wartości dla option
  1. function fillSelect(currCat,currList){
  2. var step = Number(currList.name.replace(/\D/g,""));
  3. for (i=step; i<nLists+1; i++) {
  4. document.forms['tripleplay']['List'+i].length = 1;
  5. document.forms['tripleplay']['List'+i].selectedIndex = 0;
  6. }


zmiana styli jest tu:

  1. function getValue(L3, L2, L1) {
  2. alert("Your selection was:- \n" + L1 + "\n" + L2 + "\n" + L3);
  3.  
  4. document.getElementById("mydiv2").style.display="none";
  5. document.getElementById("mydiv3").style.display="none";
  6.  
  7. if (L1 == "2") {
  8. document.getElementById("mydiv2").style.display="block";
  9. }
  10. if (L1 == "3") {
  11. document.getElementById("mydiv3").style.display="block";
  12.  
  13. }


powinno być w fillSelect, ale tam mi nie działa........... :-(
trueblue
A obecnie działa?
Skoro jak już wiesz, że powinno być w fillSelect, to może pokażesz właśnie kod tej funkcji po modyfikacjach?
krzesik
  1. function fillSelect(currCat,currList){
  2. var step = Number(currList.name.replace(/\D/g,""));
  3. for (i=step; i<nLists+1; i++) {
  4. document.forms['tripleplay']['List'+i].length = 1;
  5. document.forms['tripleplay']['List'+i].selectedIndex = 0;
  6.  
  7. document.getElementById("mydiv2").style.display="none";
  8. document.getElementById("mydiv3").style.display="none";
  9.  
  10. if (L1 == "2") {
  11. document.getElementById("mydiv2").style.display="block";
  12. }
  13. if (L1 == "3") {
  14. document.getElementById("mydiv3").style.display="block";
  15.  
  16. }
  17.  
  18. var nCat = categories[currCat];
  19. for (each in nCat) {
  20. var nOption = document.createElement('option');
  21. var nData = document.createTextNode(nCat[each]);
  22. nOption.setAttribute('value',nCat[each]);
  23. nOption.appendChild(nData);
  24. currList.appendChild(nOption);
  25. }
  26. }
trueblue
Napisałem w poście #2 i #4, że powinieneś sprawdzać czy są dane dla listy czy nie, jeśli są, to pokazywać następny <select>.
Gdzie w tym kodzie uzależniasz pokazywanie listy od zawartości poprzedniej?
krzesik
  1. if (!empty(document.forms['tripleplay']['List1'])) {
  2. document.getElementById("mydiv2").style.display="block";
  3. }
  4. if (!empty(document.forms['tripleplay']['List2'])) {
  5. document.getElementById("mydiv3").style.display="block";
  6.  
  7. }


zwariuje....
trueblue
empty w JavaScript?

W którym miejscu w kodzie wypełniasz listę?
krzesik
  1. for (each in nCat) {
  2. var nOption = document.createElement('option');
  3. var nData = document.createTextNode(nCat[each]);
  4. nOption.setAttribute('value',nCat[each]);
  5. nOption.appendChild(nData);
  6. currList.appendChild(nOption);
  7. }


pisałem na początku że jestem noga z JS
trueblue
Tok postępowania nie ma związku z językiem programowania.

Tak. W tym fragmencie. Mając zmienną nCat wiesz czy ma w sobie jakieś elementy czy nie, bo jest tablicą. Jeśli tablica ma jakieś elementy, to włączasz pokazywanie tej listy, ale nie kolejnych. Domyślnie, czyli przed sprawdzeniem czy tablica jest pusta, a właściwie po prostu na zdarzenie change wyłączasz widoczność tej listy i następnych.

Czyli zmieniam listę1. Wyłączam widoczność lista2 i lista3. Uzupełniam zawartość lista2. Jeśli były dane do uzupełnienia, to włączam widoczność lista2.
Jeśli zmieniam listę2, to wyłączam widoczność lista3. Uzupełniam listę3, a jeśli były dane to włączam jej widoczność.
krzesik
Bardzo mi pomogły Twoje podpowiedzi, już mi to działa, ale mam jeszcze jedno pytanie czy jeśli zrobię to analogicznie to chciałbym aby po wybraniu odpowiedniej opcji pojawił mi się ukryty input.
wydaje mi się że zrobiłem dobrze, ale jednak efekt końcowy nie jest taki jaki oczekuję. Zerknij proszę

  1. for (each in nCat) {
  2. var nOption = document.createElement('option');
  3. var nData = document.createTextNode(nCat[each]);
  4. nOption.setAttribute('value',nCat[each]);
  5. nOption.appendChild(nData);
  6. currList.appendChild(nOption);
  7.  
  8. if ((document.forms['tripleplay']['List1'].value=='2') || (document.forms['tripleplay']['List1'].value=='3'))
  9. {
  10. document.getElementById("mydiv2").style.display="block";
  11. }
  12. else
  13. {
  14. document.getElementById("mydiv2").style.display="none";
  15. }
  16.  
  17. if (document.forms['tripleplay']['List1'].value!='' && document.forms['tripleplay']['List2'].value=='6')
  18. {
  19. document.getElementById("mydiv2").style.display="block";
  20. document.getElementById("mydiv3").style.display="block";
  21. }
  22. else
  23. {
  24. document.getElementById("mydiv3").style.display="none";
  25. }
  26. if (document.forms['tripleplay']['List2'].value=='3')
  27. {
  28. document.getElementById("mydiv4").style.display="block";
  29. }
  30. else
  31. {
  32. document.getElementById("mydiv4").style.display="none";
  33. }
  34. }
  35.  
  36.  
  37. ....................
  38.  
  39. <div id="mydiv4" class="form-group" style="display:none">
  40. <label for="uwagi">Numer </label>
  41. <input name="nr_probki" type="text" id="uwagi" value="123456" readonly class="form-control">
  42. </div>
  43.  


dziękuję za cierpliwość i pomoc. jest już OK
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.