Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Powtarzające się zmienne, jak ich uniknąć
kwiateusz
post
Post #1


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




Witam

Z nudów piszę sobie skrypcik (proszę zwrócić uwagę że uczę się js winksmiley.jpg) i powtarzaja mi sie zmienne w 2 funcjach i teraz pytanko do was jak zrobić aby to się nie powtarzało winksmiley.jpg Poniżej kod :

  1. function PokazUkryj()
  2. {
  3. var pasek=$('pasek');
  4. var tresc=$('tresc');
  5. var img= pasek.childNodes[0];
  6.  
  7. pasek=pasek.getElementsByTagName('span')[0];
  8.  
  9. if (tresc.style.display == 'block' || my_getcookie('hide')==0)
  10. {
  11. tresc.style.display='none';
  12. pasek.innerHTML='Pokaż';
  13. img.src='exp_minus.gif';
  14. my_setcookie('hide',1);
  15. }
  16. else
  17. {
  18. tresc.style.display='block';
  19. pasek.innerHTML='Schowaj';
  20. img.src='exp_plus.gif';
  21. my_setcookie('hide',0);
  22. }
  23. }
  24.  
  25.  
  26. function check()
  27. {
  28. if(my_getcookie('hide')==1)
  29. {
  30. var tresc=$('tresc');
  31. var pasek=$('pasek');
  32. var img= pasek.childNodes[0];
  33. img.src='exp_minus.gif';
  34. tresc.style.display='none';
  35. pasek.childNodes[1].innerHTML='Pokaż';
  36. }
  37. }


chodzi mi dokladnie o
  1. var tresc=$('tresc');
  2. var pasek=$('pasek');
  3. var img= pasek.childNodes[0];


Z góry dzięki za pomoc smile.gif

Ten post edytował kwiateusz 11.07.2006, 00:42:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Przeanalizuj to:
  1. <script language="javascript">
  2. var zmienna = 'zmienna';
  3.  
  4. function function1() {
  5. alert('function1: ' + zmienna);
  6. };
  7.  
  8. function function2() {
  9. alert('function2: ' + zmienna);
  10. };
  11. function1();
  12. function2();
Go to the top of the page
+Quote Post
kwiateusz
post
Post #3


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




właśnie tak prubowałem i co dziwne skrypt przestawał działać .... po prostu funkcje zmiennych nie widziały... albo znowu coś pokręciłem winksmiley.jpg
Go to the top of the page
+Quote Post
siemakuba
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


Generalnie zmienne w JS mają zasięg globalny. Wypunktuję co i jak, bo tak łatwiej:
- zmienna utworzona poza funkcją za pomocą var - globalna
- zmienna utworzona poza funkcją bez var - globalna
- zmienna utworzona wewnątrz funkcji bez var - globalna
- zmienna utworzona wewnątrz funkcji za pomocą var - lokalna dla funkcji

pozdr.
Go to the top of the page
+Quote Post
kwiateusz
post
Post #5


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




Kod
var pasek=document.getElementById('pasek');
   var tresc=$('tresc');
   var img= pasek.childNodes[0];

function PokazUkryj()
{
   alert(pasek);
   alert(tresc);


zrobiłem tak i w alertach mam null :/
Go to the top of the page
+Quote Post
siemakuba
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


pod jaka przegladarka pracujesz? Polecam FF i konsole JavaScript.
Czy null to ogólne stwierdzenie, że nic nie pokazuje? JavaScript pod FF nie zrobi alerta na pustej wartości. Pod IE zdaje sie pokaze undefined.

A moze masz ten skrypt w HEAD wstawiony? Wtedy wykona sie jeszcze przed powstaniem drzewa DOM i nie bedzie dostepu do elementow.

Jak mozesz to pokaz wiecej kodu :)

pozdr.
Go to the top of the page
+Quote Post
kwiateusz
post
Post #7


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




tak mam ff i konsolke i pokazuje pasek hasn no properities

null to nie ogólne stwierdzenie tylko pokazuje sie taki string w okienku od alertt...

owszem mam to w head, ale jak zmienne sa w funkcji to ładuje się ładnie a jak poza to już się wali...

  1. <script type="text/javascript">
  2. function $(id)
  3. {
  4. itm = null;
  5.  
  6. if (document.getElementById)
  7. {
  8. itm = document.getElementById(id);
  9. }
  10. else if (document.all)
  11. {
  12. itm = document.all[id];
  13. }
  14. else if (document.layers)
  15. {
  16. itm = document.layers[id];
  17. }
  18.  
  19. return itm;
  20. }
  21. function my_getcookie( name )
  22. {
  23. var cname = name + '=';
  24. var cpos = document.cookie.indexOf( cname );
  25.  
  26. if ( cpos != -1 )
  27. {
  28. cstart = cpos + cname.length;
  29. cend = document.cookie.indexOf(";", cstart);
  30.  
  31. if (cend == -1)
  32. {
  33. cend = document.cookie.length;
  34. }
  35.  
  36. return unescape( document.cookie.substring(cstart, cend) );
  37. }
  38.  
  39. return null;
  40. }
  41.  
  42. function my_setcookie( name, value)
  43. {
  44. var expire = "; expires=Wed, 1 Jan 2020 00:00:00 GMT";
  45.  
  46. document.cookie = name + "=" + value + expire + ';';
  47. }
  48.  
  49. var pasek=document.getElementById('pasek');
  50. var tresc=$('tresc');
  51. var img= pasek.childNodes[0];
  52.  
  53. function PokazUkryj()
  54. {
  55. alert(pasek);
  56. alert(tresc);
  57. pasek=pasek.getElementsByTagName('span')[0];
  58.  
  59. if (tresc.style.display == 'block' || my_getcookie('hide')==0)
  60. {
  61. tresc.style.display='none';
  62. pasek.innerHTML='Pokaż';
  63. img.src='exp_minus.gif';
  64. my_setcookie('hide',1);
  65. }
  66. else
  67. {
  68. tresc.style.display='block';
  69. pasek.innerHTML='Schowaj';
  70. img.src='exp_plus.gif';
  71. my_setcookie('hide',0);
  72. }
  73. }
  74.  
  75. function check()
  76. {
  77. if(my_getcookie('hide')==1)
  78. {
  79. var tresc=$('tresc');
  80. var pasek=$('pasek');
  81. var img= pasek.childNodes[0];
  82. img.src='exp_minus.gif';
  83. tresc.style.display='none';
  84. pasek.childNodes[1].innerHTML='Pokaż';
  85. }
  86. }
  87. -->
  88. </head>
  89. <body onload="check()">
  90. <div id="pasek" style="background: gray; height:20px; width:100%" ><img src='exp_plus.gif' onclick="java script:PokazUkryj()" style="float: right; padding:5px;" border='0' /><span>Schowaj</span><br /></div>
  91. <div id="tresc" style="background: red; display:block;">Test</div>
  92. </body>
  93. </body>
  94. </html>


Ten post edytował kwiateusz 11.07.2006, 10:12:36
Go to the top of the page
+Quote Post
siemakuba
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


no widzisz,
1. co sie dzieje kiedy masz zmienne w funkcji?
wartosc im zostanie przypisana dopiero kiedy wywolana zostanie funkcja. U ciebie wywolujesz fukcje check() za pomoca zdarzenia onload dla BODY == drzewo DOM jest zbudowane, zmienne prawidlowo otrzymuja wartosci.

2. co sie dzieje kiedy zmienne masz poza funkcja?
wartosc zostaje przypisana w momencie wykonania kodu. Jetesmy wiec w HEAD i probojemy przypisac zmiennej wartosc za pomoca getElementById. To sie nie uda, bo getElementById nie zna jeszcze struktury dokumentu. Pozna ja po zalkowitym zaladowaniu dokumentu do przegladarki.

3. robimy test.
wystaw zmienne poza funkcje, ale przypisz im jakas stala wartosc, np. jakis dowlony string. Wszystko powinno zadzialac, tzn. alert powinien wyswietlic wartosc tych zmiennych.

pozdr.
Go to the top of the page
+Quote Post
kwiateusz
post
Post #9


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




heh winksmiley.jpg dzięki za pokazanie błędu więc musze to do body wsadzić aby zaradzić mojemu problemowi winksmiley.jpg jeszcze raz dzięki

@siemakuba jak już tak ładnie tłumaczysz to wyjaśniłbyś mi jak to jest z zasięgiem funkcji?

np. mam jakas funkcje w head pomiedzy <script /> i czy bedzie ona widoczna w body pomiędzy <script /> oraz czy wyżej wymieniona funkcja $() zadziała w zdarzeniach typu onclick ?
Go to the top of the page
+Quote Post
siemakuba
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


Funkcje masz widoczne wszędzie od momentu, kiedy zostaną załadowane - bez znaczenia czy będziesz chciał ich użyć w zdarzeniach typu onclick bezpośrednio w HTML, czy w innym kodzie gdzieś niżej na stronie. Najlepiej wszystkie ładować w HEAD i ewentualnie wywoływać co potrzeba przez zdarzenie onload dla BODY. A jeszcze lepiej trzymać w zewnętrznym pliku - będzie wszystko zcachowane przez przeglądarkę więc będzie ładowane przy pierwszym odwiedzeniu strony. Tu uwaga - podczas testowania może wyglądać na brak reakcji na zmiany w skrypcie, ale wystarczy zamiast F5 zrobić "twardy refresh" - Ctrl+R i będzie kul :)

pozdr.
Go to the top of the page
+Quote Post
kwiateusz
post
Post #11


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




aha dzięki winksmiley.jpg muszę dokładniej książke studiować winksmiley.jpg biorę się za czytanie i testowanie. Dzięki za pomoc
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 07:08