Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Niemożliwość odczytania elementu po kilkukrotnym wczytaniu zawartości do tego samego elementu
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
puz219
Witam.

Napisałem sobie przy użyciu jQuery skrypt wczytujący dynamicznie zawartość pliku do elementu <div>. Do tej pory wszystko jest w porządku, jednak ów <div> zawiera w sobie kolejny, który po najechaniu na ten, do którego zawartość się wczytuje staje się widoczny, a po opuszczeniu elementu ukrywa się. Wszystko prosto i przy pierwszym wczytaniu zawartości wszystko działa, ale jeżeli wczytam już zawartość po raz drugi, ten podrzędny div już się nie wyświetla w ogóle.

Trochę skomplikowany ten opis, ale przedstawiam poniżej kod, który może naświetli co nieco tę sytuację

index.php
  1. <div class="app">
  2.  
  3. <div class="column viewer"></div>
  4. <div class="column menu">
  5.  
  6. <a href="#" id="cat-1" class="cat-btn">Opcja #1</a>
  7. <a href="#" id="cat-2" class="cat-btn">Opcja #2</a>
  8. <a href="#" id="cat-3" class="cat-btn">Opcja #3</a>
  9. <a href="#" id="cat-4" class="cat-btn">Opcja #4</a>
  10. <a href="#" id="cat-5" class="cat-btn">Opcja #5</a>
  11.  
  12. </div>
  13. <div class="clear"></div>
  14.  
  15. </div>


product.php
  1. <img src="images/sample01.jpg" />
  2. <img src="images/sample02.jpg" />
  3. <img src="images/sample03.jpg" />
  4. <img src="images/sample04.jpg" />
  5. <img src="images/sample05.jpg" />
  6.  
  7. <div class="popup">Element Title</div>


A teraz kod w jQuery:

  1. $("a.cat-btn").each( function() {
  2.  
  3. $(this).click( function() {
  4.  
  5. if($(".viewer").is(":empty")) {
  6.  
  7. $(".viewer").load("product.php?cat=" + $(this).attr("id"), function(response, status, xhr) {
  8.  
  9. if(status == "success") {
  10.  
  11. $(this).fadeIn();
  12.  
  13. viewer_functions(); //funkcja odpowiedzialna za wyswietlenie diva
  14.  
  15. }
  16.  
  17. });
  18.  
  19. }
  20.  
  21. else {
  22.  
  23. $(".viewer").empty().hide();
  24.  
  25. $(".viewer").load("product.php?cat=" + $(this).attr("id"), function(response, status, xhr) {
  26.  
  27. if(status == "success") {
  28.  
  29. $(this).fadeIn();
  30.  
  31. viewer_functions(); //funkcja odpowiedzialna za wyswietlenie diva
  32.  
  33. }
  34.  
  35. });
  36.  
  37.  
  38. }
  39.  
  40. });
  41.  
  42. });
  43.  
  44.  
  45. function viewer_functions() {
  46.  
  47. $(.viewer).hover(function() {
  48.  
  49. $(this).find(".popup").fadeIn();
  50.  
  51. }, function() {
  52.  
  53. $(this).find(".popup").fadeOut();
  54.  
  55. });
  56.  
  57. }


Generalnie chodzi o to, iż po drugim wczytaniu zawartości product.php do elementu "viewer" skrypt nie znajduje już elementu "popup", przez co ten element się w ogóle nie wyświetla.

Proszę o jakieś sugestie by rozwiązać ten problem.

Z góry dziękuję za odpowiedź.
kamil4u
Daj link do demo( uproszczona wersja strony ).

Prawdopodobnie przy wyszukiwaniu elementu klasy, skrypt sam "nie wie", który element ma wziąć. Jak wiadomo, elementów o tej samej klasie może być wiele i przy używaniu .klasa zwracana jest tablica elementów( dokładnie obiektów jQuery ) i Ty jako programista musisz wskazać, o który element Ci chodzi.
puz219
Kod w moim poście, to wersja demo, generalnie skrypt jest bardziej zaawansowany, lecz problemem jest to, iż po ponownym wczytaniu zawartości pliku skrypt, który zaznaczę wyraźnie przy pierwszym wczytaniu poprawnie wyszukuje element i wykonuje funkcję, lecz juz po każdym kolejnym wczytaniu zawartości pliku do boxu tego elementu nie widzi.

Twoje sugestie na temat iż może być kolejny element o takiej samej klasie są niestety mylne, gdyż, sprawdziłem jeszcze raz dokładnie, i nie ma drugiego elementu o takiej klasie.

Poza tym, zrobiłem jeszcze pewien eksperyment i po wczytaniu za drugim razem zawartości do boxu, otworzyłem konsolę w chrome i po ręcznym wpisaniu $(".popup").show(); element ładnie się wyświetlił.

I właśnie nie znajduję w tym żadnej logiki.
kamil4u
Cytat
Kod w moim poście, to wersja demo

Problem w tym, że nie. Prosiłem o link do strony, gdyż dzięki temu mogę samemu przeanalizować co się tam dzieje, pozmieniać coś za pomocą firebug-a i posprawdzać konsolę błędów. A tak to muszę kopiować Twoje kody i bawić się w to samemu i w sumie marnuję czas, który mógłbym już przeznaczyć tylko na pomoc i analizę kodu. Nie chcę żebyś odebrał to jako jakiś atak czy to, że mój czas jest bardzo cenny, ale też mógłbyś to trochę docenić.

Niemniej zrobiłem to, czyli przekopiowałem Twoje pliki lokalnie, dołączyłem bibliotekę jQuery i uruchomiłem skrypt. Dość szybko stwierdziłem, że to nie jest kod, który masz na swojej stronie, gdyż konsola błędów wskazuje błędy. Chyba, że jesteś na tyle początkujący, że nie korzystasz z konsoli, w takim razie gorąco Cię do tego zachęcam, bo to bardzo ułatwia życie programiście JS. Błąd polega na tym, że w funkcji "viewer_functions", w pierwszej linii nie masz " w $(.viewer).

Tak więc proszę o link do konkretnego demo, chyba, że rzeczywiście jedynym błędem był brak tego " smile.gif

Pozdrawiam
puz219
Gdybyś czytał ze zrozumieniem moje posty, byłoby znacznie łatwiej się nam dogadać.

Pozwól więc, że w ramach wyjaśnienia wypunktuję Ci odpowiedzi na najbardziej nurtujące Cię pytania:

- To nie jest oryginalny kod - oryginalny jest bardziej złożony i nie ma najmniejszego sensu go tutaj udostępniać, gdyż jedynie ten fragment sprawia problemy.
- Kod zamieszczony tutaj pisałem "na poczekaniu", by zobrazować sytuację, tak więc jakieś tam niedopatrzenia mogły się zdarzyć, ale podkreślę to jeszcze raz, to nie jest oryginalny kod, który mam na serwerze, tak, że ten brak " nie ma tutaj najmniejszego znaczenia
- Kod na serwerze działa bezproblemowo przy pierwszym wczytaniu zawartości pliku project.php, tak więc nie może być żadnych błędów w zapisie, nieprawdaż?

Jedynie przy każdym następnym wczytaniu zawartości tego pliku do elementu "viewer", skrypt nie znajduje elementu "popup", lecz ponownie przy pierwszym wczytaniu wszystko jest ok, a więc nie jest to jakiś tam brak "
AdIoS_Neo
Witam,
skopiowałem cały Twój przykładowy kod i wszystko działa poprawnie, napis "Element Title" cały czas się pokazuje, jeśli się na niego najedzie to znika zgodnie z założeniem funkcji przekazanej do metody hover, jeśli się najedzie na miejsce gdzie powinien być to się pokazuje (zgodnie z założeniem). Po kliknięciu w którąś z opcji zawartość do div.viewer zostaje wczytana i nawet jeśli wcześniej div.popup znikł to po ponownym wczytaniu pokazuje się (trzeba uważać by po kliknięciu w którąś z opcji nie zostawić kursora w tym samy miejscu bo na to miejsce wskakuje właśnie element popup a opcje zjeżdżają niżej, a jak wiadomo po zjechaniu kursorem z elementu popup on znika).
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.