2011-08-03 6 views
20

Dobra, poniższy kod „działa”, że podczas przewijania na dole strony funkcja AJAX jest zwolniony, a wyniki są dołączane do div #postswrapper w sprawie strona.jQuery Nieskończony Scroll - zdarzenie wyzwala wiele razy podczas przewijania jest szybki

Problem polega na tym, że jeśli przewijam się bardzo szybko po dotarciu do dolnej części strony, AJAX strzela kilka razy i ładuje kilka zestawów wyników do div #postswrapper (liczba dodatkowych, "niechcianych" wyników jest określana przez ile dodatkowych zdarzeń przewijania zostało wystrzelonych przez szybkie przewijanie).

Ostatecznie muszę służyć tylko jeden zestaw wyników za czas użytkownik osiągnie dno. Próbowałem dodawać timery i takie, ale bez skutku. Oczywiście przechowywanie dodatkowych czynności przewijania w DOM i wypalanie ich w kolejności sekwencyjnej po tym.

Wszelkie pomysły?

Używam jquery.1.4.4.js jeśli pomaga nikomu. I e.preventDefault() nie działa, w tej sytuacji, tak czy inaczej.

$(window).scroll(function(e) { 
    e.preventDefault(); 
    if ($(window).scrollTop() >= ($(document).height() - $(window).height())) { 
     $('div#loadmoreajaxloader').show(); 
     $.ajax({ 
      cache: false, 
      url: 'loadmore.php?lastid=' + $('.postitem:last').attr('id'), 
      success: function(html) { 
       if (html) { 
        $('#postswrapper').append(html); 
        $('div#loadmoreajaxloader').hide(); 
       } else { 
        $('div#loadmoreajaxloader').html(); 
       } 
      } 
     }); 
    } 
}); 
+1

Niepożądane Powoduje to, że „loadmore.php” skrypt zostanie wykonany szereg dodatkowych czasy, kiedy nie jest to konieczne. Po prostu potrzebuję, za każdym razem, gdy użytkownik znajdzie się na dole strony, ten fragment kodu, aby uruchomić jeden (1) czas, załaduj odpowiednie wyniki za pomocą loadmore.php i nie ładuj niczego, dopóki użytkownik nie dotrze do dolnej części strony jeszcze raz. – Marc

Odpowiedz

42

Spróbuj zapisać jakieś dane, które przechowują informacje o tym, czy strona aktualnie ładuje nowe produkty. Może tak:

$(window).data('ajaxready', true).scroll(function(e) { 
    if ($(window).data('ajaxready') == false) return; 

    if ($(window).scrollTop() >= ($(document).height() - $(window).height())) { 
     $('div#loadmoreajaxloader').show(); 
     $(window).data('ajaxready', false); 
     $.ajax({ 
      cache: false, 
      url: 'loadmore.php?lastid=' + $('.postitem:last').attr('id'), 
      success: function(html) { 
       if (html) { 
        $('#postswrapper').append(html); 
        $('div#loadmoreajaxloader').hide(); 
       } else { 
        $('div#loadmoreajaxloader').html(); 
       } 
       $(window).data('ajaxready', true); 
      } 
     }); 
    } 
}); 

Tuż przed żądania Ajax jest wysyłany, flaga jest czyszczony co oznacza, że ​​dokument nie jest gotowy do większej liczby żądań AJAX. Gdy Ajax zakończy się pomyślnie, ustawia flagę z powrotem na true i można wywołać więcej żądań.

+2

Tak, kolego! Miałem podobną logikę wcześniej, ale ją przybiłeś. Działa jak urok. Twoje zdrowie! – Marc

+0

Po prostu natknąłem się na to i działa świetnie - dzięki! –

+0

Awesome hack, thanks! Połączyłem zarówno kod w pytaniach, jak i odpowiedź, aby rozwiązać ten sam problem, dziękuję! – Hugo

Powiązane problemy