Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Problem z rekurencją
Forum PHP.pl > Forum > Przedszkole
sweter
Witam,
cały dzień dzisiejszy pisałem funkcję parsującą listę
  1. <ul id="main_category" class="categories">
  2. <li id="id1-Sklep">Sklep
  3. <ul id="cat1" class="categories">
  4. <li id="id2-Hardware">Hardware
  5. <ul id="cat2" class="categories">
  6. </ul>
  7. </li>
  8. <li id="id5-Software">Software
  9. <ul id="cat5" class="categories">
  10. <li id="id6-OS">OS
  11. <ul id="cat6" class="categories"></ul>
  12. </li>
  13. <li id="id7-Gry">Gry
  14. <ul id="cat7" class="categories"></ul>
  15. </li>
  16. </ul>
  17. </li>
  18. </ul>
  19. </li>
  20. </ul>

i zwracającą mi obiekt z tejże listy z odpowiednimi zagłębieniami. Oto ona:
[JAVASCRIPT] pobierz, plaintext
  1. function rekurencja(id_listy){
  2. alert('wysołanie f-cji #'+id_listy);
  3. var result = $('#'+id_listy).sortable('toArray');
  4. var new_tab = new Object();
  5. //alert('result.length '+result.length);
  6. for(q=0; q<result.length; q++){
  7.  
  8. new_tab[q] = new Object();alert("@"+result[q]);
  9. new_tab[q]['id'] = result[q];
  10. new_tab[q]['child'] = new Object();
  11.  
  12. children = document.getElementById(new_tab[q]['id']).childNodes;
  13. //alert(new_tab[q]['id']+"->"+children.length);
  14. if(children.length>1){
  15. for(w=0; w<children.length; w++){
  16. if((children[w] instanceof HTMLUListElement)){
  17. name = children[w].id;
  18. alert("petla "+name);
  19. new_tab[q]['child'] = rekurencja(name);
  20. }
  21. }
  22. }
  23. }
  24. return new_tab;
  25. }
[JAVASCRIPT] pobierz, plaintext

W skrócie to funkcja działa tak:
1. pobiera id element listy (<ul>)
2. wyciąga elementy <li> za pomocą sortable() (zapożyczyłem z jQuery)
3. tworzymy nowy obiekt new_tab
4. w pętli do każdego elementu obiektu przypisujemy wartość id z elementy <li>
5. jeżeli dany element ma jakiś element <ul> pod sobą funkcja jest wykonywana ponownie.

To znaczy powinno to działać, bo jak zauważyłem to funkcja działa wyłącznie dla elementów w głąb. Np. mając taką listę:
Kod
Sklep
   Hardware
      Procesory
      HDD
   Software
      OS
      Gry

skrypt idzie Sklep->Hardware->Procesory->HDD. W ogóle nie rozumiem dlaczego tak się dzieje sad.gif
Rekurencja wywołana jest chyba prawidłowo.
Proszę o rady i poprawki
zegarek84
przed snem po tych piwach dokładnie nie chce mi się analizować tego kodu skoro nie podałeś gotowej strony do analizy [no nie będę sobie robił mini stronki ;p]...

podstawowy błąd dlaczego Ci indeksy giną przy następnych przebiegach pętli - tak, przy następnych przebiegach pętli gdy znowu wywołujesz tą samą funkcję ingerujesz do definicji zmiennych jeszcze nie skończonej wcześniej funkcji - a nie do końca definicji co do wartości - poczytaj o zasięgu zmiennych - jeśli zmienne "lokalne" nie poprzedzisz słowem kluczowym var to lądują one do globalnego skope do window i mogą być wykorzystywane przez inne nawet zagnieżdżone funkcje...

linijka:
for(q=0; q<result.length; q++){
oraz:
for(w=0; w<children.length; w++){

wchodząc do funkcji rekurencyjnej dla q i w znowu przypisujesz im wartość równą 0 - zmienne są zdefiniowane pod window.q oraz window.w... a samej ścieżki przebiegu algorytmu "procesów" nie bardzo chce mi się analizować kiedy nadpisujesz lub gubisz dane ;] tym bardziej, że przed snem lubię sobie wypić kilka browarków ;p... pozatym na to co sprawdzasz mogłeś inaczej wyszukać elementy li niż przez sortable [skoro korzystasz z jquery to mogłeś szukać dzieci li w kontekście ul, lub mogłeś przelecieć wszystkie dzieci w czystym js w DOM i sprawdzić tagName - lub jeśli wolisz nodeName]
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.