Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Przesuwanie ofert.
Forum PHP.pl > Forum > Przedszkole
MeGusta
Witam,
Mam problem z zrobieniem przesuwania ofert, po kliknięciu w div który ma data-id="x" funkcja generuje z tablicy kod html a następnie wstawia go do diva .galery, problem w tym, że po kliknięciu na .move-left przesuwa się tylko o jedno lub wogole, dodatkowo funkcja generate_min ktora generuje html z miniaturkami zdjęć z tej samej tablicy generuje ostatnie zdjecie + nowe, a nie tylko nowe.

Klikniecie na oferte:

  1. $('.realize').click(function(){
  2.  
  3. $this = $(this);
  4.  
  5. var data = $this.attr('data-id');
  6.  
  7. $('body').append('<div class="black-screen"><div class="galery">' + generateview(data) + '</div></div>');
  8.  
  9. $('.move-right').click(function(){
  10. data++;
  11. $('.galery').html(generateview(parseInt(data) + 1))
  12. console.log(parseInt(data) + 1)
  13. });
  14.  
  15. $('.move-left').click(function(){
  16. $('.galery').html(generateview(parseInt(data) - 1))
  17. console.log(parseInt(data) - 1)
  18. data--;
  19. });
  20.  
  21. });


Funkcja generująca miniaturki:

  1. var min_img_for = [];
  2.  
  3. function generate_min(data)
  4. {
  5. $.each(data_realize[data][7], function(key, value) {
  6. min_img_for += '<div class="img-sml"> ' + value + ' </div>';
  7. });
  8.  
  9. return min_img_for;
  10. }


Do funkcji generateview podaję id z atrybutu data-id po którym wyswietlam dane z tablicy.

Struktura html:
  1. <div data-id="1" class="realize">
  2. <img src="img/realizacja-1.png" alt="" />
  3. <div class="realize-hover"></div>
  4. <div class="desc-realize">
  5. Tablice Reklamowe (Billboard)
  6. </div>
  7. </div>
  8. <div data-id="2" class="realize">
  9. <img src="img/realizacja-1.png" alt="" />
  10. <div class="realize-hover"></div>
  11. <div class="desc-realize">
  12. Tablice Reklamowe (Billboard)
  13. </div>
  14. </div>
  15.  
  16. i tak dalej


Sama tablica wygląda tak:
  1. var data_realize =
  2. [[
  3. 0,
  4. '<img src="./img/big-img-realize.png" />',
  5. 'Bilboard dla <br>"Galeria Krakowska"',
  6. 'Lorem Ipsum jes...',
  7. '21 dni',
  8. '5m x 2.5m',
  9. '500 zł',
  10. ['<img src="./img/min-image-realize.png" />', ''] // tu sa miniaturki
  11. ],
  12. ];
nospor
Sieczka... totalny brak logiki i jeden wielki haos....


Na poczatek masz od razu data zrzutowac na liczbe i potem mozesz normalnie dodawac i odejmowac.
var data = parseInt($this.attr('data-id'));


Jak juz raz odjales/dodales to nie rob tego ponownie w przekazywaniu do parametru.

No i patrz co piszesz bo wyglada jakbys losowo stukal w klawiature
MeGusta
Poprawione:
  1. $('.realize').click(function(){
  2.  
  3. $this = $(this);
  4.  
  5. var data = parseInt($this.attr('data-id'));
  6.  
  7. $('body').append('<div class="black-screen"><div class="galery">' + generateview(data) + '</div></div>');
  8.  
  9. $('.move-right').click(function(){
  10. data++;
  11. $('.galery').html(generateview(data))
  12. });
  13.  
  14. $('.move-left').click(function(){
  15. $('.galery').html(generateview(data))
  16. data--;
  17. });
  18.  
  19. });


Dalej to samo, przerzuca się tylko o jedno, tak jakby data++ wykonywał się tylko raz.
Dodatkowo funkcja generate_min() tak jakby do starych zdjęć z pierwszego elementu tablicy dopisuje z drugiego elementu.
nospor
Nogdzie nie widze bys aktualizowal atrybut data-id wiec dosc logiczne ze ciagle ma te sama wartosc
MeGusta
Zwiększam za każdym kliknięciem data++;
Próbowałem też:
  1. var self = $this;
  2. $('.move-right').click(function(){
  3. $('.galery').html(generateview(data))
  4. self.attr('data-id', data + 1)
  5. });


Ale dalej to samo.
nospor
Cytat
Zwiększam za każdym kliknięciem data++;

Co z tego ze zwiekszasz jak i tak za kazdym razem to nadpisujesz o tutaj:
var data = $this.attr('data-id');

Cytat
Dodatkowo funkcja generate_min() tak jakby do starych zdjęć z pierwszego elementu tablicy dopisuje z drugiego elementu.

Bo nie zerujesz min_img_for
MeGusta
Właśnie tu problem leży, że po kliknieciu na div .realize otwiera się okno i to wszystko jest w nim generowane, nie mam pojęcia jak to var data wyrzucić poza aby się nie nadpisywało na początku.
nospor
Dobrze by bylo jakbys to wystawil online
MeGusta
https://jsfiddle.net/9gh9h1f3/2/

Przesuwa się tymi strzałkami po prawo na dole.
nospor
A mozesz te strzalki dac na gore? Bo na moim lapku niestety nie jestem w stanie ich siegnac sad.gif
MeGusta
Jasne, proszę bardzo.

https://jsfiddle.net/9gh9h1f3/3/
nospor
W prawo przesuwa ci sie tylko raz, bo jak klikniesz na to to nadpisujesz zawartosc diva nowym htmlem przez co tracisz przypisania click. Albo zainteresuj sie ON w jquery albo po kazdym nadpisaniu kodu html generuj nowe CLICK dla strzalek
MeGusta
Masz na myśli abym generował onclick dla strzałek?
nospor
Teraz generujesz CLICK dla strzales w momencie otworzenia okna. Gdy klikasz strzalke nadpisujesz stare strzalki nowymi i nowe strzalki nie maja juz CLICK. Albo wiec uzyj ON ktore bedzie sie podczepiac pod kazde strzalki albo za kazdym nadpisaniem okna tworz CLICK na nowo
MeGusta
Kurcze nie rozumiem, moze dla tego ze dopiero zaczynam z javascriptem. Mógłbyś dać jakis przykład?
viking
W skrócie. Każdy element tak długo ma zdarzenia, jak długo występuje w dokumencie i nie zostanie nadpisany lub zdarzenie usunięte. Chyba że zdarzenie nasłuchuje rodzic wtedy nowo utworzony element będzie wiedział jak się zachować. Tu masz to opisane.
MeGusta
Jeśli uzyję .on('click', function(){}) i potem .off() stracę this i np. wyłaczanie okna nie bedzie działac.
viking
Dlaczego masz this stracić? Albo można je przepisać do innej zmiennej albo przyjrzyj się w konsoli takim właściwościom jak event.delegateTarget
MeGusta
Kurcze, siedze od rana nad tym i chyba nic sam nie wskóram, za mało jeszcze potrafię, cały czas sie uczę. Mógłby ktoś pomóc mi z tym kodem? Bardzo bym prosił.
nospor
Jedyne co miales zrobic to zamienic CLICK na ON. W czym problem?
MeGusta
Zmieniłem lecz nadal nie działa.
nospor
No to pokaz kod po zmianach
MeGusta
  1. $('.realize').on('click', function(){
  2.  
  3. $this = $(this);
  4.  
  5. var data = parseInt($this.attr('data-id'));
  6.  
  7. $('body').append('<div class="black-screen"><div class="galery">' + generateview(data) + '</div></div>');
  8.  
  9. $('.move-right').click(function(){
  10. min_img_for = '';
  11. $('.galery').html(generateview(data))
  12. data++;
  13.  
  14. });
  15.  
  16. $('.move-left').click(function(){
  17. min_img_for = '';
  18. $('.galery').html(generateview(data))
  19. data--;
  20. });
  21.  
  22. });
nospor
data++;
no ale to chyba masz zwiekszac przed funckja a nie po funkcji.

No i pokaz kod na czyms online
MeGusta
łap:
https://jsfiddle.net/9gh9h1f3/4/

Nie mam pojęcie czemu to nie działa sad.gif
nospor
Pod ON miales podpiac strzalki a nie obrazki glowne
MeGusta
Dobra, zamieniłem tak jak mówiłeś, lecz nadal tak samo wszystko funkcjonuje sad.gif

Live:
https://jsfiddle.net/9gh9h1f3/5/
nospor
dziwne... a powinno dzialac. Pewnie jakis glupi blad ktorego nie widzimy.

W takim razie proponuje ci po wciskaniu strzalek podmieniac same obrazki i tekst a nie caly blok generowac a nowo. Wowczas strzalki pozostana niezmienione i bedzie dzialac
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.