Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] chowanie elementów
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Edpl
Witam,
w panelu administracyjnym systemu który obecnie pisze, korzystam z formularzy i innych elementów strony posiadających "display=none" i pokazujących się dopiero po kliknięciu w jakiś link. Chciałbym żeby przy rozwinięciu którejś opcji, ta poprzednio otwarta się chowała.
Jak to zrobić najlepiej? Możnaby chować wszystkie elementy posiadające zdefiniowane 'id' o obojętnej wartości (jak?). Tu pojawia się problem z planowanym wprowadzeniem CSS'a... wtedy chowała by mi się większość strony... jak to rozwiązać lepiej?

Zaznaczam, że w javascripcie jestem zielony.
#luq
Zrobić sobie obiekt do tego celu.
W jednej właściwości będzie przechowywany aktualnie otwarty element (lub jego id).
Metoda close() zamykająca aktualnie otwarte, oraz metoda open() w której najpierw jest wywołana metoda close() a później "otwierany" jest element podany jako parametr.
erix
A po co?

Jest przecież selektor: warstwa:visible [;
Edpl
Pomysł dobry, dziwie sie, że wcześniej nie wpadlem na to... ale jak zrealizowac? chcialem podobnie na 'zmiennych' (przypominam ze w java scripcie jestem zielony i nawet nie wiem czy sie dobrze do tego zabieralem.
Mialem taki kod:

  1. <script language="JavaScript">
  2. <!--
  3. function show(parametr)
  4. // Function that will swap the display/no display for
  5. // all content within span tags
  6. {
  7. if (parametr.style.display == "none")
  8. {
  9. parametr.style.display = "";
  10. }
  11. else
  12. {
  13. parametr.style.display = "none";
  14. }
  15. }
  16. -->


Probowalem zrobic to tak:

  1. if (parametr.style.display == "none"){
  2. stary.style.display = "none";
  3. parametr.style.display = "";
  4. stary = parametr;
  5. }


ale oczywiscie nie dziala... o obiektach nic nie wiem niestety.
erix
Ja to robię mniej więcej tak. Załóżmy takie menu:
  1. <dl>
  2. <dt>asd</dt>
  3. <dd>sda</dd>
  4.  
  5. <dt>asd</dt>
  6. <dd>sda</dd>
  7.  
  8. <dt>asd</dt>
  9. <dd>sda</dd>
  10. </dl>


<dd/> zawiera treść, są domyślnie ukryte.

Teraz JS:
Kod
$('dl dt').click(function(e){
  e.preventDefault();
  $(this).parent()
    .find('dd:visible').slideUp()
    .end().next().slideDown();
}

Przyznam, że ostatnio spodobały mi się konstrukcje bazujące na uchwytach zdarzeń (e), o tym poczytaj gdzieś, gdzie opisany jest DOM; IMHO to dużo bardziej eleganckie rozwiązanie niż zwykłe return false. Co dalej?

Bieżący uchwyt, to kotwica rozwijająco-chowająca, czyli wyzwalacz zdarzeń. Po kolei: wskakuje na poziom rodzica i wyszukuje w nim wszystkie widoczne warstwy treści, po czym je zwija. Następnie wraca "do siebie" (za pomocą czego, to sprawdź w dokumentacji) i szuka swojego sąsiada, którego rozwija. [;

Jak widzisz, całego potworka można zapisać w postaci wywoływania metod łańcuchowych obiektu jQuery i m.in. dlatego jest on taki za...jefajny. [;

A jak to dostosować do Twojego kodu? Zadanie domowe. [;
Edpl
a ja jednak pierwszy pomysł doprowadziłem do działania;)
Twój sposób erix był zbyt niezrozumiały dla kogoś kto w ogóle się nie interesuje javascriptem, bo używa go naprawde sporadycznie;)

mój kod wygląda tak:

  1. <?php
  2. function show(parametr)
  3. {
  4. if (parametr.style.display == "none")
  5. {
  6.  if (typeof(stary) == "undefined"){
  7.  } else {
  8.    stary.style.display = "none";
  9.  }
  10.  parametr.style.display = "";
  11.  stary = document.getElementById(parametr.id);
  12. }
  13. else
  14. {
  15. parametr.style.display = "none";
  16. }
  17. }
  18. ?>
erix
Cytat
Twój sposób erix był zbyt niezrozumiały dla kogoś kto w ogóle się nie interesuje javascriptem, bo używa go naprawde sporadycznie;)

Po przeczytaniu kursu JavaScript, pobieżnym przejrzeniu dokumentacji DOM nie powinno być problemów. [;
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.