Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Sekcyjne ukywanie pól formularza
Forum PHP.pl > Forum > Przedszkole
The Night Shadow
Mam formularz podzielony na sekcje za pomocą fieldset. Jak za pomocą JS sprawić, by po kliknięciu w LEGENDĘ danej sekcji tag DL znajdujący się wewnątrz zmieniał styl na display: none; i odpowiednio block w przypadku, gdy już był ukryty?

Chodzi mi o uniwersalny skrypt bez koneiczności nadawania ID każdemu DL i FIELDSET.

  1. <fieldset><dl>TU SĄ POLA FORMULARZY</dl></fieldset>


Klikamy w fieldset i dl znika. Klikamy ponownie i DL pojawia się.
bluesqad
Może to pomoże:

http://ferrante.pl/2007/02/27/praktyczne-w...o-javascript-3/
The Night Shadow
Zauważ, że mowa tu o identyfiaktorach, a ja wyraźnie napisałem: "Chodzi mi o uniwersalny skrypt bez koneiczności nadawania ID każdemu DL i FIELDSET."

Wiem, że chodzi o skrypty związane z getElementByTagName, ale nie bardzo potrfię to co wiem wykorzystać w praktyce.

Łopatologicznie powinno to funkcjonować tak:

Podajemy w funkcji id formularza. Funkcja pobiera z tego formularza wszystkie tagi FIELDSET, a następnie dodaje do nich zdarzenie ONCLICK, które warunkuje pokazanie / ukrycie elementów DL znajdujących się w fieldset. chociaż to też nie do końca, bo zdarzenie onclick powinno dotyczyć legendy w fieldset.

Zrobiłem coś takiego:

  1. <form action="" method="post" id="formularz">
  2. <legend>Część pierwsza</legend>
  3. <dl>
  4. <dt>Pierwsze pole</dt>
  5. <dd><input type="text" name="pierwsze_pole" alue="" /></dd>
  6. <dt>Drugie pole</dt>
  7. <dd><input type="text" name="drugie_pole" alue="" /></dd>
  8. </dl>
  9. <legend>Część druga</legend>
  10. <dl>
  11. <dt>Trzecie pole</dt>
  12. <dd><input type="text" name="trzecie_pole" alue="" /></dd>
  13. <dt>Czwarte pole</dt>
  14. <dd><input type="text" name="czwarte_pole" alue="" /></dd>
  15. </dl>
  16. </form>
  17.  
  18. <script type="text/javascript">
  19.  
  20. function aktywacja_ukrywania_formularza ( id )
  21. {
  22. this.id = id;
  23.  
  24. var tagi_fieldset = document.getElementById(id).getElementsByTagName('fieldset');
  25.  
  26. for (var n = 0; n < tagi_fieldset.length; ++n)
  27. {
  28. var tagi_dl = tagi_fieldset[n].getElementsByTagName('dl');
  29. var tag_legend = tagi_fieldset[n].getElementsByTagName('legend');
  30.  
  31. tag_legend[0].onclick = function () { for (var m = 0; m < tagi_dl.length; ++m) { if ( tagi_dl[m].style.display == 'none' ) { tagi_dl[m].style.display = ''; } else { tagi_dl[m].style.display = 'none'; } } };
  32. }
  33. }
  34.  
  35. aktywacja_ukrywania_formularza ( 'formularz' );
  36.  


Problem jednak polega na tym, że ukrywane jest tylko ostatnie dl, ponieważ do funkcji w onclick wędrują zmienne nadpisywane w kolejncyh krokach for.

Co z tym zrobić?
piotrooo89
ja zrobiłem w jQuery coś takiego: klikasz raz znika, klikasz 2x pojawia się:

  1. <script type="text/javascript" src="jquery.js"></script>
  2.  
  3. <script type="text/javascript">
  4. $(document).ready(function()
  5. {
  6. $('fieldset').click(function ()
  7. {
  8. $(this).children('dl').hide();
  9. return true;
  10. });
  11. $('fieldset').dblclick(function ()
  12. {
  13. $(this).children('dl').show();
  14. return true;
  15. });
  16. });
  17.  
  18.  
  19. <form action="" method="get">
  20. <legend>Część pierwsza</legend>
  21. <dl>
  22. <dt>Pierwsze pole</dt>
  23. <dd><input type="text" name="pierwsze_pole" value="" /></dd>
  24. <dt>Drugie pole</dt>
  25. <dd><input type="text" name="drugie_pole" value="" /></dd>
  26. </dl>
  27. <legend>Część druga</legend>
  28. <dl>
  29. <dt>Trzecie pole</dt>
  30. <dd><input type="text" name="trzecie_pole" value="" /></dd>
  31. <dt>Czwarte pole</dt>
  32. <dd><input type="text" name="czwarte_pole" value="" /></dd>
  33. </dl>
  34. </form>
The Night Shadow
No to już jest blisko tylko że ja chciałbym, by klikało się w legend. Zauważ, że na FF możesz kliknąc w pole fomularza które jest w fieldset i fieldset znika.

Poza tym chciałbym, by nie trzeba było kliakć dwa razy by pokazać pola.

Wypłodziłem coś takiego i działa :- )

  1. <?php
  2. <script type="text/javascript">
  3.  
  4.   $(document).ready(function()
  5.   {
  6.      $('fieldset').children('legend').click(function ()
  7.      {
  8.         if ( $(this).parent().children('dl').css("display") == 'none' )
  9.         {
  10.            $(this).parent().children('dl').show();
  11.         }
  12.         else
  13.         {
  14.            $(this).parent().children('dl').hide();
  15.         }
  16.         return true;
  17.      });
  18.   });
  19.  
  20. </script>
  21. ?>
piotrooo89
a ja jeszcze zoptymalizowałem (bo zapomniałem o tej funkcji :| )

  1. <script type="text/javascript">
  2. $(document).ready(function()
  3. {
  4. $('legend').click(function ()
  5. {
  6. $(this).next().toggle();
  7. return true;
  8. });
  9. });
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.