2010-05-14 3 views
10

Also im Grunde ist mein Problem ein scheinbar einfaches.jQuery: Erkennung von unteren Ende des Scroll funktioniert nicht, erkennt nur die oberen

Sie können es in Aktion bei http://furnace.howcode.com sehen (bitte beachten Sie, dass Daten über Ajax zurückgegeben werden, wenn nichts passiert, geben Sie es ein paar Momente!).

Was passiert, ist MEANT, ist in der zweiten Spalte, wenn Sie den unteren Rand des Scrollens erreichen, werden die nächsten 5 Ergebnisse zurückgegeben.

Aber was tatsächlich passiert ist, dass es nur die 5 Ergebnisse zurückgibt, wenn Sie den TOP des Bildlaufbereichs treffen. Probieren Sie es aus: Scrollen Sie nach unten, nichts passiert. Scrollen Sie zurück nach oben, die Ergebnisse werden zurückgegeben.

Was läuft falsch?

Hier ist mein Code Ich verwende:

$('#col2').scroll(function(){ 
    if ($('#col2').scrollTop() == $('#col2').height() - $('#col2').height()){ 
     loadMore(); 
    } 
}); 

loadMore(); ist die Funktion, die Daten erhält und fügt es.

Also was läuft hier falsch? Danke für Ihre Hilfe!

+0

Ich fürchte nichts funktioniert. Hat jemand weitere Ideen? – Jack

Antwort

11

Ihre Mathematik ist falsch, Sie sagen, wenn die Bildlaufleiste Position gleich der Höhe der Spalte minus der Höhe der Spalte (die gleich Null ist) laden mehr. Deshalb wird Ihr loadMore() an der Spitze Ihrer Spalte aufgerufen.

Versuchen:

$('#col2').scroll(function(){ 
    if ($('#col2').scrollTop() == $('#col2').height()){ 
     loadMore(); 
    } 
}); 
+1

Ich fürchte, das funktioniert nicht. Ich habe es kopiert, nachdem ich es manuell eingegeben habe, aber nichts passiert. Die ursprüngliche URL, von der ich die ursprüngliche Quelle bekommen habe, war diese: http://www.webresourcesdepot.com/load-content-while-scrolling-with-jquery/ – Jack

13

Das hat für mich in der Vergangenheit zusammengearbeitet.

var col = $('#col2'); 
col.scroll(function(){ 
    if (col.outerHeight() == (col.get(0).scrollHeight - col.scrollTop())) 
     loadMore(); 
}); 

Hier ist eine gute explanation auch.

+0

Ich habe mir die Erklärung angesehen und dein Beispiel ausprobiert - aber nichts das passiert. Ich kann wirklich nicht verstehen warum. Irgendwelche weiteren Ideen? – Jack

+1

@Jack Webb-Heller - Ich kann nachvollziehen, warum. Ich habe etwas Wichtiges verpasst. 'scrollHeight' kann nicht für das jquery-Objekt verwendet werden. Sie müssen 'col [0] .scrollHeight' angeben, damit es funktioniert. Ich bearbeitete die Antwort, um das mit einzuschließen – munch

+1

'col.get (0) .scrollHeight' ist eine passendere jQuery Weise, um damit umzugehen – munch

1

Die Lösung, die Jordanstephens veröffentlicht, ist auf dem richtigen Weg. Was Sie jedoch brauchen, ist nicht die Höhe von # col2, Sie brauchen die Höhe des Elternelements von # col2.

Beispiel:

$('#col2').scroll(function(){ 
    if ($('#col2').scrollTop() == $('#col2').parent().height()) { 
    loadMore(); 
    } 
} 
+1

Das übergeordnete Element ist im Grunde $ (Dokument), # col2 ist ein Top-Level-Tag. Ich habe das versucht aber immer noch kein Glück. Ich kann nicht wirklich viel sagen ... da passiert nichts! : S – Jack

+0

Wenn das übergeordnete Dokument das Dokument ist, dann anstelle von $ ('# col2'). Parent(). Height() benutze einfach $ (window) .height() – Mark

24

Die folgende getestet wurde und funktioniert gut:

$(window).scroll(function() { 
    if ($(window).scrollTop() == $(document).height() - $(window).height()) { 
    loadMore(); 
    } 
}); 
+1

Es kann nützlich sein, die Funktion in eine [a] entprellen] (http://lodash.com/docs#debounce) Funktion, um die Leistung zu verbessern. –

+0

+1 Funktioniert wie ein Charme! – dariush

1

Vielleicht funktioniert das folgende:

  1. HTML - wickeln, was im Inneren # col2 mit einem anderen DIV, sagen wir # col2-inner
  2. CSS - setzen Sie eine feste Höhe ht und 'Überlauf: auto' nur für # col2
  3. JS - siehe unten Plugin:

    $.fn.scrollPaging = function (handler) { 
        return this.each(function() { 
         var $this = $(this), 
          $inner = $this.children().first(); 
    
         $this.scroll(function (event) { 
          var scrollBottom = $this.scrollTop() + $this.height(), 
           totalScroll = $inner.height(); 
    
          if (scrollBottom >= totalScroll) { 
           handler(); 
          } 
         }); 
    
        }); 
    }; 
    
    $('#col2').scrollPaging(loadMore); 
    
1

@munch am nächsten war, aber wenn Sie eine Grenze auf dem Element haben, dann müssen Sie Verwenden Sie .innerHeight() anstelle von .outerHeight(), da letzteres den Rahmen und .scrollTop() nicht enthält (.height() ist ebenfalls out, wenn Sie einen Padding haben). Außerdem würde ich zumindest ab jQuery 1.7.1 und vielleicht früher die Verwendung von .prop ('scrollHeight') empfehlen, anstatt sie direkt vom DOM abzurufen.Ich fand some talk, dass das DOM scrollHeight auf IE 5-8 gebrochen ist und die jQuery-Funktion abstrahiert das für mich, zumindest auf IE8.

var $col = $('#col2'); 
$col.scroll(function(){ 
if ($col.innerHeight() == $col.prop('scrollHeight') - $col.scrollTop()) 
    loadMore(); 
}); 
+0

Ihre Antwort funktionierte perfekt für mich, vielen Dank :) – Systemfreak

2

Ich fand eine Alternative, die funktioniert.

Keiner dieser Antworten funktionierte für mich (derzeit Test in FireFox 22.0), und nach viel Forschung fand ich, was scheint, eine viel sauberere und unkomplizierte Lösung.

Implementiert Lösung:

function IsScrollbarAtBottom() { 
    var documentHeight = $(document).height(); 
    var scrollDifference = $(window).height() + $(window).scrollTop(); 
    return (documentHeight == scrollDifference); 
} 

Ressource: http://jquery.10927.n7.nabble.com/How-can-we-find-out-scrollbar-position-has-reached-at-the-bottom-in-js-td145336.html

Grüße

0

Ich weiß, diese Frage bereits gelöst, aber ein Problem bei der Verwendung von jQuery scrollTOp() Funktion auf anderes Element als auf $(window).scrollTop() oder $(document).scrollTop() seit einige Ausgabe wie

jQuery: detecting reaching bottom of scroll doesn't work, only detects the top

Explain why scrollTop() always returns 0 here

$(document).scrollTop() always returns 0

So können Sie

$(window).scrollTop() - $('your_selector').offset().top 

statt

$('your_selector').scrollTOp() 

verwenden, um die jQuery scrollTOp() Problem zu vermeiden.

Mein Vorschlag lautet wie folgt:

$(window).scroll(function() { 
     var $more = $('#col2'); 
     var top = $(window).scrollTop() - $more.offset().top; 
     if(top + $more.innerHeight() >= $more[0].scrollHeight) { 
      loadMore(); 
     } 
    }); 
Verwandte Themen