Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][AJAX] Ładowanie kategorii do selecta
d.stp
post
Post #1





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

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


Próbuje zrobić wybór kategorii zależny od wyboru poprzedniego selecta. Mam formularz:

  1. <select name="cats">
  2. <option value="1">test</option>
  3. <option value="2">test 2</option>
  4. <option value="3">test 3</option>


i ajax:

  1. function showCats(str) {
  2. if (str == "") {
  3. document.getElementById("txtHint").innerHTML = "";
  4. return;
  5. } else {
  6. if (window.XMLHttpRequest) {
  7. // code for IE7+, Firefox, Chrome, Opera, Safari
  8. xmlhttp = new XMLHttpRequest();
  9. } else {
  10. // code for IE6, IE5
  11. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. }
  13. xmlhttp.onreadystatechange = function() {
  14. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  15. document.getElementById("cats_join").innerHTML = xmlhttp.responseText;
  16. }
  17. }
  18. xmlhttp.open("GET","select.php?cat_id="+str,true);
  19. xmlhttp.send();
  20. }
  21.  
  22. }


takie coś ładuje mi ładnie podkategorie zależne od wyboru kategorii głównej. Problem w tym, że te podkategorie mają jeszcze swoje podkategorie i wtedy jak pojawi mi się drugi select to już nie ładuje dalej po wyborze jakiejś opcji :/ tak samo drugi select (ten który się pojawił) nie reaguje już naawet na:

  1. //kategorie
  2. $('.cats').on('change', function(){
  3. alert(1);
  4. var cat_id = $(this).val();
  5. showCats(cat_id);
  6.  
  7. });


W select.php tworzę sobie ten select a opcje do niego pobieram z bazy...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
freewalker
post
Post #2





Grupa: Zarejestrowani
Postów: 90
Pomógł: 4
Dołączył: 14.02.2015

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


no tak, przez appenda dopisujesz ciągle nową treść, w takim przypadku rozwiązałbym to numerowaniem poziomu kategorii w selectach, np:

kategoria główna = lvl 1
podkategoria = lvl 2
podkategoria podkategorii = lvl 3


Zaczynając od założenia zmiennej globalnej w kodzie JS:
var max_levels=1; // 1 jak tylko główna kategoria jest zaladowana, każde rozwinięcie spowoduje inkrementację o +1

wymaga też to zmodyfikowania trochę HTMLa dla znacznika select, dodaj atrybut lvl z najnizszym poziomem (w naszym przypadku 1)
  1. <select class='cats' name='moj_select' lvl='1'>


kazdy kolejny select generowany przez skrypt powinien miec zwiekszany atrybut lvl o 1 (az do poziomu maksymalnego danej kategorii), czyli wstawiamy selecta appendem, odnajdujemy ostatnio dodanego w tym divie i zmieniamy jego atrybut lvl uprzednio zwiększając zmienną max_levels o 1;
u ciebie w kodzie będzie to chyba w tym miejscu:

  1. xmlhttp.onreadystatechange = function() {
  2. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  3. $('#cats_join').append(xmlhttp.responseText);
  4.  
  5. max_levels+=1;
  6. $("#cats_join").find("select.cats:last").attr("lvl",max_levels);
  7.  
  8. binder_catschange(); // wywolanie funkcji bindowania
  9. }


modyfikujemy też odpowiednio funkcję binder i dodajemy funkcję usuwającą niepotrzebne podkategorie

  1. function binder_catschange() {
  2. $('.cats').unbind().bind('change', function(){
  3. var cat_id = $(this).val();
  4. category_lvl=$(this).attr('lvl');
  5.  
  6. if(category_lvl < max_levels) remove_unwanted_cats(category_lvl);
  7.  
  8. alert(cat_id);
  9. showCats(cat_id);
  10. });
  11. }
  12.  
  13. function remove_unwanted_cats(actual_lvl)
  14. {
  15. start_removing=actual_lvl+1;
  16. end_removing=max_levels+1;
  17.  
  18. for(i=start_removing;i<end_removing;i++)
  19. {
  20. $("#cats_join").find("select.cats[lvl="+i+"]").remove();
  21. }
  22.  
  23. max_levels=actual_lvl;
  24. }


mam nadzieję, że działa bo tak na sucho ciężko się pisze i nie wiadomo czy gdzieś byka nie postawiłem : ) ale chyba najważniejsze, żebyś załapał logikę a na pewno sobie poradzisz

Ten post edytował freewalker 17.02.2015, 23:52:34
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 16:30