Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ukrywanie div
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
mateuszpi
Witam
mam kod do ukrycia pewnego div-a (swoją drogą znaleziony u Was)
wszystko działa pięknie ale niestety po przejściu na inną stronę i powrocie to wszystko wraca do stanu początkowego a ja potrzebuje aby to co zostało ustawione było zapamiętane. zapewne trzeba użyć ciasteczek. prosze o pomoc i modyfikacje kodu:
  1. <script type="text/javascript">
  2. <!--
  3. function pokazUkryj(id)
  4. {
  5. document.getElementById(id).style.display = (document.getElementById(id).style.display == "none") ? "block" : "none";
  6. }
  7. -->
  8.  
  9. <a href="javascript:pokazUkryj('menu_1')">Zwiń/Rozwiń</a>
  10. <div id="menu_1" style="display:none"><!--Powinno być ukryte...-->
  11. </div>


z góry dzieki.
kubarek
No dobrze rozumujesz. Użyj ciasteczek winksmiley.jpg A żeby zapamiętać i odczytać, to coś w ten deseń:
Kod
// odczytywanie:
window.onload = function(){
    var stan = odczytajCiastko(id_elementu);
    pokazUkryj(id_elementu);
}

// zapisywanie:
pokazUkryj = function(id) {
   ...
   var stan = (document.getElementById(id).style.display == "none");
   zapiszCiastko(id_elementu, stan);
}
mateuszpi
albo ja nie rozumiem albo coś jest nie tak:
  1. <script type="text/javascript">
  2. <!--
  3.  
  4. // odczytywanie:
  5. window.onload = function()
  6. {
  7. var stan = odczytajCiastko(id_elementu);
  8. pokazUkryj(id_elementu);
  9. }
  10.  
  11. // zapisywanie:
  12. pokazUkryj = function(id)
  13. {
  14. var stan = (document.getElementById(id).style.display == "none");
  15. zapiszCiastko(id_elementu, stan);
  16. }
  17.  
  18.  
  19. function pokazUkryj(id)
  20. {
  21. document.getElementById(id).style.display = (document.getElementById(id).style.display == "none") ? "block" : "none";
  22. }
  23.  
  24. -->
  25.  


i teraz wogóle nie działa nic. nawet odkryć ukrytego tekstu się nie da
lord_t
Nie działa bo kubarek nie podał Ci rozwiązania na tacy tylko podpowiedźsmile.gif nie masz funkcji odczytajCiastko i zapiszCiastko.
mateuszpi
poszukałem na google i po twoich poradch skombinowałem funkcję do odczytu i zapisu. wsadziłęm całość i nadal nic się nie da zrobić.

  1. <script type="text/javascript">
  2. <!--
  3.  
  4. function zapiszCiastko(nazwa, wartosc) {
  5. document.cookie = nazwa + "=" + escape(wartosc)
  6. }
  7.  
  8. function odczytajCiastko(nazwa) { //1
  9. if (document.cookie!="") { //2
  10. var toCookie=document.cookie.split("; "); //3
  11. for (i=0; i<toCookie.length; i++) { //4
  12. var nazwaCookie=toCookie[i].split("=")[0]; //5
  13. var wartoscCookie=toCookie[i].split("=")[1]; //6
  14. if (nazwaCookie==nazwa) return unescape(wartoscCookie) //7
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. // odczytywanie:
  22. window.onload = function()
  23. {
  24. var stan = odczytajCiastko(id_elementu);
  25. pokazUkryj(id_elementu);
  26. }
  27.  
  28. // zapisywanie:
  29. pokazUkryj = function(id)
  30. {
  31. var stan = (document.getElementById(id).style.display == "none");
  32. zapiszCiastko(id_elementu, stan);
  33. }
  34.  
  35.  
  36. function pokazUkryj(id)
  37. {
  38. document.getElementById(id).style.display = (document.getElementById(id).style.display == "none") ? "block" : "none";
  39. }
  40.  
  41. -->
  42.  


czyba jednak musze poprosić o "tace" bo chyba nie dojde osobiście.
kubarek
Jeszcze teraz nad tym myślałem trochę, więc wygląda nieco inaczej, niż przedstawiłem w pierwszym poście. A więc tak ( zdania nie rozpoczyna się od 'a więc' winksmiley.jpg ):
Tworzysz funkcję pokazUkryj, z parametrem id, itd:
Kod
function pokazUkryj(id)
{
    var stan = (document.getElementById(id).style.display == "none");
    document.getElementById(id).style.display = stan ? "block" : "none";
    zapiszCiastko(id, !stan);
}

Pobiera stan elementu, czyli sprawdza czy element jest niewidoczny. Następnie zmienia ten stan i zapisuje już zmieniony do cookies ( stąd ten wykrzyknik w funkcji zapiszCiastko). Czyli zapisuje true, jeśli element nie jest widoczny albo false, jeśli jest widoczny. Odczytywanie wygląda zaś tak. Tworzysz funkcję, która wczytuje zapisany stan i na jego podstawie decyduje, czy element ma być widoczny, czy ukryty.
Kod
function odczytajStan(id){
    var stan = odczytajCiastko(id);
    document.getElementById(id).style.display = stan ? "block" : "none";
}


No i funkcja ładująca się na starcie:
Kod
window.onload = function(){
   var id = "id_elementu_ktory_ma_miec_wczytany_stan_na_starcie";
   odczytajStan(id);
}

Jeśli jest wiele takich elementów, to no problem, użyj tablicy:
Kod
window.onload = function(){
   var elementy = ["elem1", "elem2", "elem3"];
   for (var i = 0; i < elementy.length; i++) odczytajStan(elementy[i]);
}

Pisane z palca, więc mogą być pewne błędy, ale ogólnie idea jest właśnie taka smile.gif
Fixer
Przedstawiam gotowiec...



Zalety:
-zapisywanie/odczytywanie statusu przez cookie
-łatwa modyfikacja wyglądu stylem css
-szybka integracja ze stroną
-kompatybilność z przeglądarkami IE, FF

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4.  
  5. <title>Show/Hide + cookie</title>
  6.  
  7. <style type="text/css">
  8. <!--
  9. body,td,th {
  10. font-family: Verdana, Arial, Helvetica, sans-serif;
  11. color: #000000;
  12. }
  13. body {
  14. background-color: #FFFFFF;
  15. margin-left: 10px;
  16. margin-top: 10px;
  17. margin-right: 10px;
  18. margin-bottom: 10px;
  19. }
  20. a {
  21. font-family: Verdana, Arial, Helvetica, sans-serif;
  22. font-size: 12px;
  23. color: #FFFFFF;
  24. }
  25. a:link {
  26. text-decoration: none;
  27. }
  28. a:visited {
  29. text-decoration: none;
  30. color: #FFFFFF;
  31. }
  32. a:hover {
  33. text-decoration: none;
  34. color: #FFFFFF;
  35. }
  36. a:active {
  37. text-decoration: none;
  38. color: #FFFFFF;
  39. }
  40. .menu_naglowek {
  41. background-color: #820000;
  42.  
  43. PADDING-LEFT: 8px;
  44. PADDING-RIGHT: 8px;
  45. PADDING-TOP: 2px;
  46. PADDING-BOTTOM: 2px;
  47.  
  48. FONT-FAMILY: Verdana, Tahoma;
  49. text-align: center;
  50. FONT-SIZE: 10px;
  51. FONT-WEIGHT: bold;
  52. color: #FFFFFF;
  53. height: 18px;
  54. cursor: pointer;
  55. }
  56.  
  57. .menu_tresc {
  58. background-color: #FFFFFF;
  59.  
  60. BORDER-LEFT: 1px solid #820000;
  61. BORDER-RIGHT: 1px solid #820000;
  62. BORDER-TOP: 0px solid;
  63. BORDER-BOTTOM: 1px solid #820000;
  64.  
  65. PADDING-LEFT: 8px;
  66. PADDING-RIGHT: 8px;
  67. PADDING-TOP: 5px;
  68. PADDING-BOTTOM: 5px;
  69.  
  70. FONT-FAMILY: Verdana, Tahoma;
  71. FONT-SIZE: 10px;
  72. COLOR: #000000;
  73. }
  74. -->
  75.  
  76. <script language="javascript">
  77. function init()
  78. {
  79. var cookie = getCookie('collapse_obj');
  80. if(cookie)
  81. {
  82. var values = cookie.split(',');
  83.  
  84. for(var i = 0; i < values.length; i++)
  85. {
  86. var itm = getItem(values[i]);
  87.  
  88. if(itm)
  89. itm.style.display = 'none';
  90. }
  91. }
  92. }
  93.  
  94. function makeCookie(name, value)
  95. {
  96. var cookie = name + '=' + escape(value) + ';';
  97. document.cookie = cookie;
  98. }
  99.  
  100. function getCookie(name)
  101. {
  102. if(document.cookie == '')
  103. return false;
  104.  
  105. var firstPos;
  106. var lastPos;
  107. var cookie = document.cookie;
  108.  
  109. firstPos = cookie.indexOf(name);
  110.  
  111. if(firstPos != -1)
  112. {
  113. firstPos += name.length + 1;
  114. lastPos = cookie.indexOf(';', firstPos);
  115.  
  116. if(lastPos == -1)
  117. lastPos = cookie.length;
  118.  
  119. return unescape(cookie.substring(firstPos, lastPos));
  120. }
  121.  
  122. else
  123. return false;
  124. }
  125.  
  126. function getItem(id)
  127. {
  128. var itm = false;
  129. if(document.getElementById)
  130. itm = document.getElementById(id);
  131. else if(document.all)
  132. itm = document.all[id];
  133. else if(document.layers)
  134. itm = document.layers[id];
  135.  
  136. return itm;
  137. }
  138.  
  139. function ShowHide(id)
  140. {
  141. itm = getItem(id);
  142.  
  143. if(!itm)
  144. return false;
  145.  
  146. if(itm.style.display == 'none')
  147. itm.style.display = '';
  148. else
  149. itm.style.display = 'none';
  150.  
  151. ////////////////////
  152.  
  153. cookie = getCookie('collapse_obj');
  154. values = new Array();
  155. newval = new Array();
  156. add = 1;
  157.  
  158. if(cookie)
  159. {
  160. values = cookie.split(',');
  161.  
  162. for(var i = 0; i < values.length; i++)
  163. {
  164. if(values[i] == id)
  165. add = 0;
  166. else
  167. newval[newval.length] = values[i];
  168. }
  169. }
  170.  
  171. if(add)
  172. newval[newval.length] = id;
  173.  
  174. makeCookie('collapse_obj', newval.join(','));
  175.  
  176. return false;
  177. }
  178. </script>
  179.  
  180. </head>
  181.  
  182. <body onLoad="init()">
  183.  
  184. <table width="250" border="0" cellspacing="0" cellpadding="0">
  185. <tr>
  186. <td class="menu_naglowek" onclick="javascript:ShowHide('menu_1');"><a name="menu1" id="menu1">Menu1</a></td>
  187. </tr>
  188. <tr>
  189. <td class="menu_tresc">
  190.  
  191. <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" id="menu_1">
  192. <tr>
  193. <td height="20">nazwa1</td>
  194. </tr>
  195. <tr>
  196. <td height="20">nazwa2</td>
  197. </tr>
  198. </table>
  199.  
  200. </td>
  201. </tr>
  202.  
  203. <br />
  204. <table width="250" border="0" cellspacing="0" cellpadding="0">
  205. <tr>
  206. <td class="menu_naglowek" onclick="javascript:ShowHide('menu_2');"><a name="menu2" id="menu2">Menu2</a></td>
  207. </tr>
  208. <tr>
  209. <td class="menu_tresc">
  210.  
  211. <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" id="menu_2">
  212. <tr>
  213. <td height="20">nazwa1</td>
  214. </tr>
  215. <tr>
  216. <td height="20">nazwa2</td>
  217. </tr>
  218. </table>
  219.  
  220. </td>
  221. </tr>
  222.  
  223. </body>
  224. </html>


Jeśli chcemy aby przy pierwszym otwarciu przeglądarki jakiś fragment był domyślnie ukryty to nieco modyfikujemy kod:
zamiast
  1. <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" id="menu_1">

dajemy
  1. <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" id="menu_1" style="display: none;">


Dodatkowo jak ktoś potrzebuje zastosować tutaj elemnt <DIV> zamiast id="nazwa"
to może to zrobic tak:
  1. <div id="nazwa" style="display: block;"> (zamiast block można też wpisać none dla zawartości ukrytej domyślnie)
  2. zawartość html która będzie się pokazywać/ukrywać
  3. </div>


Z uwagi na to że na JS nie znam się za bardzo dlatego mam jeszcze do was jedno pytanie, jak przerobić tą fukcję JS powyżej, żeby można było dodać kolejny parametr mówiący o tym czy box ma być domyślnie zamknięty/otwarty po pierwszym otwarciu strony?

ShowHide('menu_2', 'true'); //jak true to otwarty a jak false to domyślnie zamknięty

PS. zmiany powinny nastąpić we funkcji init() i ShowHide() i jeśli mamy parametr false to tam gdzie było none dajemy block a tam gdzie block dajemy none

Dla kogos kto siedzi w JS to będzie prosta przeróbka, pomożecie zatem?
DawPi
Witam,
podczepię się pod wątek.

Kod usera Fixer działa, jednak nie mam żadnej styczności z JS, a chciałbym poznać sposób na mój problem:

otóż będąc w jakimś miejscu strony innym niż sama góra ( suwak po prawej przesunięty maksymalnie w górę ) po kliknięciu na link:
Kod
<tr><td class="row1" colspan="2" valign="bottom"><b>Menu</b> <a href="#" onclick="javascript:ShowHide('menu__1');"><b>Menu</b></a>( {$who_o} )  <div id="menu__1" style="display: none;"><br />zawartosc</div>  </td></tr>


strona 'zwija' się na samą górę. Można to porównać do naciśnięcia buttona na tym forum.

Chciałbym by rozwinięcie/zwinięcie nie powodowało zmiany położenia na stronie.

Dzięki za wszystkie sugestie.
tommy4
Spowodowane jest to parametrem href="#".

  1. <tr><td class="row1" colspan="2" valign="bottom"><b>Menu</b> <a href="#" onclick="javascript:ShowHide('menu__1'); return false;"><b>Menu</b></a>( {$who_o} ) <div id="menu__1" style="display: none;"><br />zawartosc</div> </td></tr>


Musisz dodać return false, wtedy kliknięcie na link się nie wykona.

BTW:
Kod
onclick="javascript:ShowHide('menu__1');
=>
Kod
onclick="ShowHide('menu__1');


Po co mówić przeglądarce, że onclick trzeba wykonać przez javascript, skoro ona to wie? Użycie "java script:" jest uzasadnione, np. gdy

  1. <a href="javascript:alert('kliknalem');">asdf</a>
, ale nawet tak się nie robi. winksmiley.jpg
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.