Bir kullanıcının en alta kaydırdığını kontrol edin


668

Kullanıcı aşağıya kaydırdığında içeriğin yüklendiği bir sayfalama sistemi (Facebook gibi bir tür) yapıyorum. Bunu yapmak için en iyi yolu kullanıcı sayfanın altında olduğunda bulmak ve daha fazla yazı yüklemek için bir ajax sorgusu çalıştırmak olduğunu düşünün.

Tek sorun kullanıcı jQuery ile sayfanın altına kaydırılmış olup olmadığını kontrol etmek bilmiyorum. Herhangi bir fikir?

Kullanıcı jQuery ile sayfanın altına kaydırdığında kontrol etmek için bir yol bulmak gerekir.


Çok komik, aşağıya doğru kaydırdığımda hangi fonksiyonun çağrıldığını anlamaya çalışıyorum, bu yüzden bu sinir bozucu "özelliği" engelleyebilirim.
endolith

Bir React.js çözümü için bu bağlantı yardımcı olabilir: stackoverflow.com/a/53158893/4265546
raksheetbhat

Yanıtlar:


1024

.scroll()Etkinliği şu şekilde kullanın window:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() == $(document).height()) {
       alert("bottom!");
   }
});

Burada test edebilirsiniz , bu pencerenin üst kaydırmasını alır, böylece ne kadar aşağı kaydırılır, görünür pencerenin yüksekliğini ekler ve bunun genel içeriğin yüksekliğine ( document) eşit olup olmadığını kontrol eder . Bunun yerine, kullanıcının en alta yakın olup olmadığını kontrol etmek isterseniz, şöyle görünecektir:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
       alert("near bottom!");
   }
});

Bu sürümü burada test edebilirsiniz , sadece 100alttan tetiklemek istediğiniz piksele ayarlayın .


32
Her zamanki gibi benden önce oraya gidiyorsun. Her neyse, OP'ye, bir gönderiler konteyneriniz varsa, "pencere" yerine onun kimliğini kullanın, ayrıca, son .height () öğesini scrollHeight
Christian

4
Firefox çağrı uyarısı ("alt!"); birçok kez (krom ve safari ile iyi çalışır)
Marco Matarazzi

3
bu biraz hatalıdır, eğer console.log()uyarı yerine bir şey yaparsanız bazen komutu tekrarlar.
Jürgen Paul

19
@KevinVella Vella iyi kombinasyonu kullanıcı kaydırmayı durdurana kadar ateş etmesini önlemek için alt çizgi yardımcı programında _.debounce () ile kullanmaktır - underscorejs.org/#debounce -
JohnnyFaldo

3
@NickCraver mevcut saf js uygulaması var mı?
Dewsworld

116

Nick Craver'ın cevabı iyi çalışıyor, değerin $(document).height()tarayıcıya göre değiştiği sorununu ortadan kaldırıyor .

Tüm tarayıcılarda çalışmasını sağlamak için James Padolsey'deki bu işlevi kullanın :

function getDocHeight() {
    var D = document;
    return Math.max(
        D.body.scrollHeight, D.documentElement.scrollHeight,
        D.body.offsetHeight, D.documentElement.offsetHeight,
        D.body.clientHeight, D.documentElement.clientHeight
    );
}

yerine $(document).height(), son kod:

$(window).scroll(function() {
       if($(window).scrollTop() + $(window).height() == getDocHeight()) {
           alert("bottom!");
       }
   });

6
Biraz sıkıştırılmış bir sürüm fonksiyonu ile güncellendi getDocHeight () {var D = belge; Math.max (D.body.scrollHeight, D.documentElement.scrollHeight, D.body.offsetHeight, D.documentElement.offsetHeight, D.body.clientHeight, D.documentElement.clientHeight); }
Drew

en alta ulaştığımda beni uyarıyor (alta değil).
Damien Roche

Kullanımı daha iyi olabilir minyerine maxyanlışlıkla sayfanın alt olduğunu düşünüyorum kaydırmadan kullanıcı önlenmesi önlemek için, bir marj zaten var, özellikle eğer.
Solomon Ucko

104

Bunun henüz gönderilmediğinden tam olarak emin değilim, ancak MDN'den gelen belgelere göre , en basit yol yerel javascript özelliklerini kullanmaktır:

element.scrollHeight - element.scrollTop === element.clientHeight

Kaydırılabilir herhangi bir öğenin altında olduğunuzda true değerini döndürür. Basitçe javascript kullanarak:

element.addEventListener('scroll', function(event)
{
    var element = event.target;
    if (element.scrollHeight - element.scrollTop === element.clientHeight)
    {
        console.log('scrolled');
    }
});

scrollHeightiken yani 8, daha doğrusu gelen, tarayıcılarda geniş desteğe sahip clientHeightve scrollTopher ikisi de herkes tarafından desteklenmektedir. Hatta yani 6. Bu, tarayıcılar arası güvenli olmalıdır.


1
Bazı durumlarda durum böyle olmayabilir. Firefox 47 bir textarea clientHeight değerini 239 olarak bildirirken, yukarıdaki denklem aşağıya kaydırıldığında 253 verir. Belki dolgu / kenarlık veya bir şey onu etkiliyor? Her iki şekilde de, kıpır kıpır bir oda eklemek acı vermezdi var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );. Bu, yalnızca alt kısımdaysa bir alanı otomatik kaydırmak için kullanışlıdır (böylece kullanıcı gerçek zamanlı günlüğün belirli bir bölümünü, yerlerini kaybetmeden vb. Manuel olarak inceleyebilir).
Beejor

Bir tarafı küçük bir ondalık dönebilirken diğer tarafı bir tam sayı döndürdüğü için yanlış negatifleri döndürmesinin mümkün olduğunu ekleyeceğim (ör. 200.181819304947Ve 200). Bununla Math.floor()başa çıkmaya yardımcı olmak için bir ekledim , ancak bunun ne kadar güvenilir olacağını bilmiyorum.
Hanna

1
Benim için, bu çapraz tarayıcı çalışmıyor. Firefox ile karşılaştırıldığında kromda tamamen farklı sonuçlar alıyorum.
Tadej

1
Bunu <body> öğesinde denedim ve tarayıcı alt tarafa değil, TOP öğesine kaydırıldığında tetikleniyor.
Chris Sobolewski

10
Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0(3.0'ı koşullarınıza uygun olduğunu düşündüğünüz piksel toleransıyla değiştirin). Bu (A) clientHeight, scrollTopve clientHeighttüm yuvarlak , çünkü tüm hizalama, (B) 3 piksel kullanıcı tarafından zor görünür, bu nedenle kullanıcı sitenizde bir sorun olduğunu düşünebilir 3 piksel hataya neden olabilir yuvarlak çünkü "düşünmediklerinde" gerçekte olmadıklarında sayfanın altındadırlar ve (C) bazı cihazların (özellikle mouseless olanlar) kaydırma sırasında garip davranışlar gösterebilirler.
Jack Giffin

50

Nick'in çözümünü kullananlar ve tekrarlanan uyarılar / olaylar tetikleniyorsa, uyarı örneğinin üzerine bir kod satırı ekleyebilirsiniz:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
       $(window).unbind('scroll');
       alert("near bottom!");
   }
});

Bu, kodun yalnızca dokümanın alt kısmının 100 piksel yakınında olduğunuzda tetikleneceği anlamına gelir. Nick'in kodunu ne için kullandığınıza bağlı olarak yararlı olabilir veya olmayabilir, yukarı ve daha sonra geri kaydırırsanız tekrarlanmayacaktır.


1
Ben sadece yorum ve bu kod satırı başkasının cevabı ama niyet için +1 ile ilgili beri nerede olduğunu söyledi!
Nate-Wilkins

Maalesef, cevaba nasıl yorum ekleyemediğimi göremedim (ve hala göremiyorum) (burada yapabileceğim gibi)?
Tim Carr

Daha fazla destek almadığınız sürece, yeni kullanıcılar gönderilere yorum ekleyemez.
Nate-Wilkins

İlk olarak, eğer senaryonun yapmasını istediğin değişikliğin var olup olmadığını test ederse, farklı bir koyabilirsen, bir div'a uygulanmış bir sınıf olduğunu söyle. Bu, zaten çalışmadıysa, ikinci iç içe geçmez.
1934286

pencerenin tamamı yerine belirli div kimliğini nasıl seçebilirim?
James Smith

40

Nick Craver'ın kabul edilen mükemmel cevabına ek olarak, scroll olayını çok sık tetiklenmemesi için kısıtlayabilir ve böylece tarayıcı performansını artırabilirsiniz :

var _throttleTimer = null;
var _throttleDelay = 100;
var $window = $(window);
var $document = $(document);

$document.ready(function () {

    $window
        .off('scroll', ScrollHandler)
        .on('scroll', ScrollHandler);

});

function ScrollHandler(e) {
    //throttle event:
    clearTimeout(_throttleTimer);
    _throttleTimer = setTimeout(function () {
        console.log('scroll');

        //do work
        if ($window.scrollTop() + $window.height() > $document.height() - 100) {
            alert("near bottom!");
        }

    }, _throttleDelay);
}

Muhtemelen bunun Underscore.js: underscorejs.org gerektirdiğine dikkat çekilmelidir . Yine de çok iyi bir nokta. Ciddi performans sorunlarından kaçınmak için scroll etkinliği hemen hemen her zaman kısıtlanmalıdır.
Jude Osborn

Belki de sadece ben ve bazı kıyaslama kullanabilirsiniz, ancak her scroll etkinliğinde clearTimeout ve setTimeout'u çağırmayı sevmiyorum. 1 setTimeout verir ve o işleyiciye bazı korumalar eklerdim. Muhtemelen sadece bir mikro optimizasyon (eğer varsa).
Umutsuzluğun Yüz burcu

Bu gerçekten düzgün bir ek! Bir gelişme daha düşünebilirim. Şu anda kullanıcı kaydırmaya devam ederse yüksekliği kontrol eden işlev çalışmaz. Bu bir sorunsa (örneğin, kullanıcının kaydırmaya devam etmesine bakılmaksızın yarı aşağı kaydırıldığında işlevi tetiklemek istiyorsanız), seçilen aralık boyunca birden çok çağrıyı engellemeye devam ederken işlevin gerçekten çağrıldığından kolayca emin olabilirsiniz. İşte size göstermek için bir öz. gist.github.com/datacarl/7029558
datacarl

Ne? Basit bir hesaplamayı önlemek için bir makine yükü çağırmak? Bunun nasıl daha verimli olduğunu görmüyorum
Rambatino

37

Nick Craver'ın cevabının iOS 6 Safari Mobile'da çalışması için biraz değiştirilmesi gerekiyor ve şunlar olmalı:

$(window).scroll(function() {
   if($(window).scrollTop() + window.innerHeight == $(document).height()) {
       alert("bottom!");
   }
});

Değişen $ (pencere) .height () için window.innerHeight adres çubuğu gizli olduğunda ek bir 60px pencerenin yüksekliğine eklenen ancak kullanarak çünkü yapılmalıdır $(window).height()yok değil bu değişiklik kullanırken, window.innerHeightyapar.

Not : window.innerHeightÖzellik, yatay kaydırma çubuğunun yüksekliğini $(window).height()içermeyecek şekilde, yatay kaydırma çubuğunun yüksekliğini de (oluşturulmuşsa) içerir. Bu, Mobil Safari'de bir sorun değildir, ancak diğer tarayıcılarda veya Mobile Safari'nin gelecekteki sürümlerinde beklenmedik davranışlara neden olabilir. Bunu değiştirmek ==, >=en yaygın kullanım durumlarında bunu düzeltebilir.

window.innerHeightTesis hakkında daha fazla bilgiyi buradan edinebilirsiniz


window.innerHeight, başarmaya çalıştığım şey için daha anlamlı oldu!
Amir5000

Kaydırma sonrası kalan yükseklik nasıl elde edilir?
OPV

20

İşte oldukça basit bir yaklaşım

const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight

Misal

elm.onscroll = function() {
    if(elm.scrollTop + elm.clientHeight == elm.scrollHeight) {
        // User has scrolled to the bottom of the element
    }
}

İe'den elmalınan bir eleman nerede document.getElementById.


17

Kodunuzu hata ayıklamanıza yardımcı olacak bir kod parçası, yukarıdaki cevapları test ettim ve buggy olduklarını gördüm. Chrome, IE, Firefox, IPad (Safari) ile ilgili aşağıdakileri test ettim. Test etmek için başka yüklü değilim ...

<script type="text/javascript">
   $(function() {
      $(window).scroll(function () {
         var docElement = $(document)[0].documentElement;
         var winElement = $(window)[0];

         if ((docElement.scrollHeight - winElement.innerHeight) == winElement.pageYOffset) {
            alert('bottom');
         }
      });
   });
</script>

Orada daha basit bir çözüm olabilir, ama ben hangi noktada durdu olabilir BT ÇALIŞTI

Bazı sahtekar tarayıcılarda hala sorun yaşıyorsanız, hata ayıklamanıza yardımcı olacak bazı kodlar şunlardır:

<script type="text/javascript">
   $(function() {
      $(window).scroll(function () {
         var docElement = $(document)[0].documentElement;
         var details = "";
         details += '<b>Document</b><br />';
         details += 'clientHeight:' + docElement.clientHeight + '<br />';
         details += 'clientTop:' + docElement.clientTop + '<br />';
         details += 'offsetHeight:' + docElement.offsetHeight + '<br />';
         details += 'offsetParent:' + (docElement.offsetParent == null) + '<br />';
         details += 'scrollHeight:' + docElement.scrollHeight + '<br />';
         details += 'scrollTop:' + docElement.scrollTop + '<br />';

         var winElement = $(window)[0];
         details += '<b>Window</b><br />';
         details += 'innerHeight:' + winElement.innerHeight + '<br />';
         details += 'outerHeight:' + winElement.outerHeight + '<br />';
         details += 'pageYOffset:' + winElement.pageYOffset + '<br />';
         details += 'screenTop:' + winElement.screenTop + '<br />';
         details += 'screenY:' + winElement.screenY + '<br />';
         details += 'scrollY:' + winElement.scrollY + '<br />';

         details += '<b>End of page</b><br />';
         details += 'Test:' + (docElement.scrollHeight - winElement.innerHeight) + '=' + winElement.pageYOffset + '<br />';
         details += 'End of Page? ';
         if ((docElement.scrollHeight - winElement.innerHeight) == winElement.pageYOffset) {
             details += 'YES';
         } else {
             details += 'NO';
         }

         $('#test').html(details);
      });
   });
</script>
<div id="test" style="position: fixed; left:0; top: 0; z-index: 9999; background-color: #FFFFFF;">

Umarım bu biraz zaman kazanır.


Vanilla js için en iyi cevap, jQuery çözümü yok. Kullanınvar docElement = document.documentElement; var winElement = window
jperelli

Bunu 2019'da winElement.pageYOffsetda kullanabilirsiniz winElement.scrollY.
Noel Abrahams

15

Lütfen bu cevabı kontrol edin

 window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
       console.log("bottom");
    }
};

Sen yapabilirsin footerHeight - document.body.offsetHeightsen altbilgi yakınlarında veya altbilgi ulaştı olmadığını görmek için


12
var elemScrolPosition = elem.scrollHeight - elem.scrollTop - elem.clientHeight;

Öğenin altına kadar olan mesafe kaydırma çubuğunu hesaplar. Kaydırma çubuğu alta ulaştıysa 0'a eşittir.


1
Aşağıdakileri yaptım ve kusursuz çalıştım. Teşekkürler. var shouldScroll = (elem.scrollHeight - elem.scrollTop - elem.clientHeight) == 0;
jiminssy

11

Bu benim iki sentim:

$('#container_element').scroll( function(){
        console.log($(this).scrollTop()+' + '+ $(this).height()+' = '+ ($(this).scrollTop() + $(this).height())   +' _ '+ $(this)[0].scrollHeight  );
        if($(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight){
            console.log('bottom found');
        }
    });

Çözümünüzü kullanmaya çalıştınız, iyi çalışıyor, ancak elemanın dolgusu olduğu durumlarda - çalışmıyor, çünkü dolguyu dahil etmeden, elemanın saf yüksekliğini hesaplıyor, bunu çözmek için bunu değiştirdim $(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
Taras Chernata

6

Saf JS ile çapraz tarayıcı ve zıplamaölçer (Oldukça iyi performans )

var CheckIfScrollBottom = debouncer(function() {
    if(getDocHeight() == getScrollXY()[1] + window.innerHeight) {
       console.log('Bottom!');
    }
},500);

document.addEventListener('scroll',CheckIfScrollBottom);

function debouncer(a,b,c){var d;return function(){var e=this,f=arguments,g=function(){d=null,c||a.apply(e,f)},h=c&&!d;clearTimeout(d),d=setTimeout(g,b),h&&a.apply(e,f)}}
function getScrollXY(){var a=0,b=0;return"number"==typeof window.pageYOffset?(b=window.pageYOffset,a=window.pageXOffset):document.body&&(document.body.scrollLeft||document.body.scrollTop)?(b=document.body.scrollTop,a=document.body.scrollLeft):document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)&&(b=document.documentElement.scrollTop,a=document.documentElement.scrollLeft),[a,b]}
function getDocHeight(){var a=document;return Math.max(a.body.scrollHeight,a.documentElement.scrollHeight,a.body.offsetHeight,a.documentElement.offsetHeight,a.body.clientHeight,a.documentElement.clientHeight)}

Demo: http://jsbin.com/geherovena/edit?js,output

Not: Debouncer, getScrollXY, getDocHeightbenim tarafımdan yazılmamış

Sadece nasıl çalıştığını ve nasıl yapacağımı gösteriyorum


Mükemmel. Firefox ve Chrome'da test edildi
Erlisar Vasquez

Aşağıdaki hatayı alıyorum: Beklenen 3 bağımsız değişken, ancak 2 var. 'C' bağımsız değişkeni sağlanmadı.
Sõber

6

Düz js benim çözüm:

let el=document.getElementById('el');
el.addEventListener('scroll', function(e) {
    if (this.scrollHeight - this.scrollTop - this.clientHeight<=0) {
        alert('Bottom');
    }
});
#el{
  width:400px;
  height:100px;
  overflow-y:scroll;
}
<div id="el">
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
</div>


4

Alt uçta ilerleyin, eşleşme koşulu için bunu deneyin

if ($(this)[0].scrollHeight - $(this).scrollTop() == 
    $(this).outerHeight()) {

    //code for your custom logic

}

3

Nick iyi yanıt verir, ancak kaydırma sırasında kendini tekrarlayan veya kullanıcı yakınlaştırılmış pencereye sahipse hiç çalışmayan işlevlere sahip olacaksınız. Ben sadece math.round ilk yükseklik etrafında kolay bir düzeltme ile geldi ve varsayıldığı gibi çalışır.

    if (Math.round($(window).scrollTop()) + $(window).innerHeight() == $(document).height()){
    loadPagination();
    $(".go-up").css("display","block").show("slow");
}

3

Aşağıdaki kodu deneyebilirsiniz,

$("#dashboard-scroll").scroll(function(){
    var ele = document.getElementById('dashboard-scroll');
    if(ele.scrollHeight - ele.scrollTop === ele.clientHeight){
       console.log('at the bottom of the scroll');
    }
});

2

Bu, kaydırılabilir bir öğeyi kontrol ederken (yani değil window) doğru sonuçlar verir :

// `element` is a native JS HTMLElement
if ( element.scrollTop == (element.scrollHeight - element.offsetHeight) )
    // Element scrolled to bottom

offsetHeightvermelidir gerçek görünür (dolgu, bir farkla, aşağıdakileri içeren bir elemanın yüksekliği ve kaydırma) ve scrollHeightbir bütün görünmez (taştı) alanlar da dahil olmak üzere bir elemanın yüksekliği.

jQuery'nin .outerHeight()JS en benzer bir sonuç vermelidir .offsetHeight- MDN'yi belgeleri için offsetHeightonun çapraz tarayıcı desteği hakkında belirsizdir. Daha fazla seçeneği kapsamak için bu daha eksiksizdir:

var offsetHeight = ( container.offsetHeight ? container.offsetHeight : $(container).outerHeight() );
if  ( container.scrollTop == (container.scrollHeight - offsetHeight) ) {
   // scrolled to bottom
}

Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeightscrollTop'un onsuz çalışmadığı bir ondalık olması durumunda deneyinMath.floor()
Michail Michailidis

1

Tüm bu çözümler Firefox ve Chrome'da benim için çalışmıyor, bu yüzden Miles O'Keefe ve meder omuraliev'in özel işlevlerini şöyle kullanıyorum :

function getDocHeight()
{
    var D = document;
    return Math.max(
        D.body.scrollHeight, D.documentElement.scrollHeight,
        D.body.offsetHeight, D.documentElement.offsetHeight,
        D.body.clientHeight, D.documentElement.clientHeight
    );
}

function getWindowSize()
{
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}

$(window).scroll(function()
{
    if($(window).scrollTop() + getWindowSize()[1] == getDocHeight())
    {
        alert("bottom!");
    }
});

1

İşte benim kabul ettiğim cevap benim için işe yaramadığı için iki sentim.

var documentAtBottom = (document.documentElement.scrollTop + window.innerHeight) >= document.documentElement.scrollHeight;

1

Scroll olayını dinlemek yerine, Kesişim Gözlemcisi'ni kullanmak , son öğenin görünüm alanında görünüp görünmediğini kontrol etmek için ucuz olanıdır (bu, kullanıcının aşağıya kaydırıldığı anlamına gelir). Ayrıca çoklu dolgulu IE7 için de desteklenir .

var observer = new IntersectionObserver(function(entries){
   if(entries[0].isIntersecting === true)
      console.log("Scrolled to the bottom");
   else
      console.log("Not on the bottom");
}, {
   root:document.querySelector('#scrollContainer'),
   threshold:1 // Trigger only when whole element was visible
});

observer.observe(document.querySelector('#scrollContainer').lastElementChild);
#scrollContainer{
  height: 100px;
  overflow: hidden scroll;
}
<div id="scrollContainer">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
  <div>Item 4</div>
  <div>Item 5</div>
  <div>Item 6</div>
  <div>Item 7</div>
  <div>Item 8</div>
  <div>Item 9</div>
  <div>Item 10</div>
</div>


Kavşak Gözlemcisi ile ilgili sorun, başlangıç ​​penceresi nispeten küçükse (kaydırma çubuğu olmadan görüntüleri getirmeden önce temel düzeni söyleyin) gözlemci geri aramasının hemen tetiklenmesidir. Kaydırma dinleyici aslında bir kişinin kaydırmasını bekler. Ve ilk resim grubu vb. Getirilmeden önce kaydırma çubuğu görünmez. Dolayısıyla Kesişim Gözlemcisi tek bir çözümde değildir.
Aleks

@Aleks .observe(...)Kullanıcının kaydırma kabınızı üzerine gelmesi / dokunması gibi bir olay dinleyicisini hemen çağırabilirsiniz, böylece hemen tetiklenmez.
StefansArya

0

JQuery olmadan yaklaşımı göstereyim. Basit JS işlevi:

function isVisible(elem) {
  var coords = elem.getBoundingClientRect();
  var topVisible = coords.top > 0 && coords.top < 0;
  var bottomVisible = coords.bottom < shift && coords.bottom > 0;
  return topVisible || bottomVisible;
}

Kısa bir örnek:

var img = document.getElementById("pic1");
    if (isVisible(img)) { img.style.opacity = "1.00";  }

5
Bu soruya cevap vermiyor. Soru, kullanıcıların pencereyi en aşağıya doğru kaydırdığını nasıl tespit edeceğiydi. Kodunuz belirli bir öğenin görüntülenip görüntülenmediğini kontrol ediyor.
Peter Hall

0

@Ddanone yanıtlama kullandım ve Ajax çağrısı ekledim.

$('#mydiv').on('scroll', function(){
  function infiniScroll(this);
});

function infiniScroll(mydiv){
console.log($(mydiv).scrollTop()+' + '+ $(mydiv).height()+' = '+ ($(mydiv).scrollTop() + $(mydiv).height())   +' _ '+ $(mydiv)[0].scrollHeight  );

if($(mydiv).scrollTop() + $(mydiv).height() == $(mydiv)[0].scrollHeight){
    console.log('bottom found');
    if(!$.active){ //if there is no ajax call active ( last ajax call waiting for results ) do again my ajax call
        myAjaxCall();
    }
}

}


0

Nick'in cevabının tekrarlanan uyarısını durdurmak için

ScrollActivate();

function ScrollActivate() {
    $(window).on("scroll", function () {
        if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
            $(window).off("scroll");
            alert("near bottom!");
        }
    });
}

0

Aradığınızda Google Chrome sayfanın tam yüksekliğini verir $(window).height()

Bunun yerine, window.innerHeightpencerenizin yüksekliğini almak için kullanın . Gerekli kontrol şöyle olmalıdır:

if($(window).scrollTop() + window.innerHeight > $(document).height() - 50) {
    console.log("reached bottom!");
}

0

Görünüşe göre benim için işe yarayan şey 'vücut' idi ve 'pencere' böyle değildi:

$('body').scroll(function() {


 if($('body').scrollTop() + $('body').height() == $(document).height()) {
     //alert at buttom
 }
 });

tarayıcılar arası uyumluluk kullanımı için:

  function getheight(){
    var doc = document;
    return  Math.max(
        doc.body.scrollHeight, doc.documentElement.scrollHeight,
        doc.body.offsetHeight, doc.documentElement.offsetHeight,
        doc.body.clientHeight, doc.documentElement.clientHeight

        );
   }

ve sonra $ (document) .height () yerine getheight () işlevini çağırın

$('body').scroll(function() {


   if($('body').scrollTop() + $('body').height() == getheight()  ) {
     //alert at bottom
 }
});

yakın alt kullanım için:

$('body').scroll(function() {


if($('body').scrollTop() + $('body').height() > getheight() -100 ) {
    //alert near bottom
 }
 });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.