Javascript: Bagaimana mendeteksi jika jendela browser digulir ke bawah?

187

Saya perlu mendeteksi apakah pengguna digulir ke bagian bawah halaman. Jika mereka ada di bagian bawah halaman, ketika saya menambahkan konten baru ke bawah, saya akan secara otomatis menggulirnya ke bagian bawah yang baru. Jika tidak ada di bagian bawah, mereka membaca konten sebelumnya lebih tinggi di halaman, jadi saya tidak ingin menggulirkannya secara otomatis karena mereka ingin tetap berada di tempat mereka.

Bagaimana saya bisa mendeteksi jika pengguna digulir ke bagian bawah halaman atau jika mereka menggulir lebih tinggi pada halaman?

Andrew
sumber
1
Yang ini bekerja di Angular 6 -> stackoverflow.com/a/42547136/621951
Günay Gültekin

Jawaban:

268
window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
        // you're at the bottom of the page
    }
};

Lihat demo

mVChr
sumber
29
Tidak berfungsi ketika elemen html / tubuh disetel ke 100% (sehingga tubuh memenuhi seluruh ketinggian viewport)
Grodriguez
5
Gunakan document.documentElement.scrollTopsebagai ganti window.scrollYuntuk IE. Tidak yakin versi IE mana yang mendukung window.scrollY.
Batandwa
3
Tidak berfungsi di Chromium Versi 47.0.2526.73 Dibangun pada Ubuntu 14.04, berjalan pada OS dasar 0.3.2 (64-bit)
K - Keracunan dalam SO semakin meningkat.
9
Saya menggunakan document.body.scrollHeight alih-alih offsetHeight (dalam kasus saya, offsetHeight selalu lebih kecil dari pada window.innerHeight)
Oliver
1
@KarlMorrison dapatkah Anda mencoba jawaban yang dianugerahkan hadiah (oleh @Dekel) dengan browser Anda?
Basj
115

Kode yang diperbarui untuk semua dukungan browser utama (termasuk IE10 & IE11)

window.onscroll = function(ev) {
    if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
        alert("you're at the bottom of the page");
    }
};

Masalah dengan jawaban yang diterima saat ini adalah itu window.scrollY tidak tersedia di IE.

Berikut ini kutipan dari mdn tentang scrollY:

Untuk kompatibilitas lintas-browser, gunakan window.pageYOffset, bukan window.scrollY.

Dan cuplikan yang berfungsi:

Catatan untuk mac

Berdasarkan komentar @ Raphaël, ada masalah di mac karena offset kecil.
Kondisi yang diperbarui berikut berfungsi:

(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2

Saya tidak memiliki kesempatan untuk mengujinya lebih lanjut, jika seseorang dapat berkomentar tentang masalah khusus ini, itu akan bagus.

Dekel
sumber
Dikonfirmasi bekerja pada FF, Chrome, IE10, Chrome untuk Android. @Dekel terima kasih!
Basj
2
Aneh kedengarannya, hanya di browser saya saya kekurangan 1 px, dan karenanya kondisi tidak terpicu. Tidak yakin mengapa, harus menambahkan beberapa px ekstra untuk membuatnya berfungsi.
Sharjeel Ahmed
3
pada komputer mac, kondisi di bawah ini tidak terpenuhi karena offset kecil (~ 1px) kami memperbarui kondisi seperti itu(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2
Raphaël
4
thx @Dekel! sebenarnya, kami mengetahui bahwa window.pageYOffset adalah float di mac. Solusi terakhir kami adalah (window.innerHeight + Math.ceil(window.pageYOffset + 1)) >= document.body.offsetHeight.
Raphaël
2
Tidak berfungsi untuk kasus di mana tubuh memiliki gaya yang menetapkan tinggi hingga 100%
raRaRa
56

Jawaban yang diterima tidak berhasil untuk saya. Ini berhasil:

window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
      // you're at the bottom of the page
      console.log("Bottom of page");
    }
};

Jika Anda ingin mendukung browser yang lebih lama (IE9) gunakan alias window.pageYOffsetyang memiliki dukungan yang sedikit lebih baik.

Ryan Knell
sumber
1
tidak bekerja di IE10 / 11. Periksa jawaban Dekel ( stackoverflow.com/questions/9439725/… ) untuk dukungan IE. Bekerja untuk saya
Herr_Schwabullek
Jawaban lainnya memicu console.log () setiap kali saya menggulir, bukan hanya ketika saya berada di bagian bawah halaman. Jawaban ini berhasil bagi saya di Chrome.
Defcronyke
Jika Anda menyingkirkan window.scrollY, yang tidak berfungsi di ie atau edge, ini adalah jawaban yang layak. Ganti dengan: (window.innerHeight + window.pageYOffset)> = document.body.scrollHeight
colemerrick
21

Saya mencari jawaban tetapi belum menemukan jawaban yang tepat. Berikut ini adalah solusi javascript murni yang berfungsi dengan Firefox, IE, dan Chrome terbaru pada saat jawaban ini:

// document.body.scrollTop alone should do the job but that actually works only in case of Chrome.
// With IE and Firefox it also works sometimes (seemingly with very simple pages where you have
// only a <pre> or something like that) but I don't know when. This hack seems to work always.
var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;

// Grodriguez's fix for scrollHeight:
// accounting for cases where html/body are set to height:100%
var scrollHeight = (document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight;

// >= is needed because if the horizontal scrollbar is visible then window.innerHeight includes
// it and in that case the left side of the equation is somewhat greater.
var scrolledToBottom = (scrollTop + window.innerHeight) >= scrollHeight;

// As a bonus: how to scroll to the bottom programmatically by keeping the horizontal scrollpos:
// Since window.innerHeight includes the height of the horizontal scrollbar when it is visible
// the correct vertical scrollTop would be
// scrollHeight-window.innerHeight+sizeof(horizontal_scrollbar)
// Since we don't know the visibility/size of the horizontal scrollbar
// we scroll to scrollHeight that exceeds the value of the
// desired scrollTop but it seems to scroll to the bottom with all browsers
// without problems even when the horizontal scrollbar is visible.
var scrollLeft = (document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft;
window.scrollTo(scrollLeft, scrollHeight);
pasztorpisti
sumber
4
Ini hampir berhasil untuk saya, tetapi saya harus menggunakan ((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)alih-alih hanya document.body.scrollHeightuntuk menjelaskan kasus-kasus di mana html / tubuh diatur ke tinggi: 100%
Grodriguez
1
@Grodriguez Terima kasih atas informasinya! Ini mungkin berguna bagi kita di masa depan! :-)
pasztorpisti
15

Ini bekerja

window.onscroll = function() {

    // @var int totalPageHeight
    var totalPageHeight = document.body.scrollHeight; 

    // @var int scrollPoint
    var scrollPoint = window.scrollY + window.innerHeight;

    // check if we hit the bottom of the page
    if(scrollPoint >= totalPageHeight)
    {
        console.log("at the bottom");
    }
}

Jika Anda ingin mendukung browser yang lebih lama (IE9) ganti window.scrollY dengan window.pageYOffset

Ifeanyi Amadi
sumber
1
ini bekerja dengan bereaksi pada 2019. bekerja dengan tinggi badan 100%, layak dengan tinggi html 100%. bekerja dengan chrome, safari, firefox, edge.
Kiwi angry
Hanya sebuah catatan: penamaan harus diubah - variabel harus diaktifkan. Karena scrollHeight menunjukkan tinggi total halaman, dan totalHeight menunjukkan titik gulir saat ini, jadi agak membingungkan.
Vladimir Marton
4

Saya baru saja mulai melihat ini dan jawaban di sini membantu saya, jadi terima kasih untuk itu. Saya telah sedikit memperluas sehingga kode aman kembali ke IE7:

Semoga ini terbukti bermanfaat bagi seseorang.

Di sini, miliki Fiddle;)

    <!DOCTYPE html>
<html>
<head>
    <style>
        div {
            height: 100px;
            border-bottom: 1px solid #ddd;
        }

        div:nth-child(even) {
            background: #CCC
        }

        div:nth-child(odd) {
            background: #FFF
        }

    </style>
</head>

<body>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
</body>

<script type="text/javascript">
console.log("Doc Height = " + document.body.offsetHeight);
console.log("win Height = " + document.documentElement.clientHeight);
window.onscroll = function (ev) {
    var docHeight = document.body.offsetHeight;
    docHeight = docHeight == undefined ? window.document.documentElement.scrollHeight : docHeight;

    var winheight = window.innerHeight;
    winheight = winheight == undefined ? document.documentElement.clientHeight : winheight;

    var scrollpoint = window.scrollY;
    scrollpoint = scrollpoint == undefined ? window.document.documentElement.scrollTop : scrollpoint;

    if ((scrollpoint + winheight) >= docHeight) {
        alert("you're at the bottom");
    }
};
</script>
</html>
Craig Poole
sumber
Semacam pekerjaan. Tapi itu tidak terlalu akurat. Itu menganggap bahwa itu digulir ke bawah selama Anda berada di dalam sekitar 16px dari bawah.
Peter Hall
4

Jika Anda mengatur height: 100%beberapa wadah <div id="wrapper">, maka kode berikut berfungsi (diuji di Chrome):

var wrapper = document.getElementById('wrapper');

wrapper.onscroll = function (evt) {
  if (wrapper.scrollTop + window.innerHeight >= wrapper.scrollHeight) {
    console.log('reached bottom!');
  }
}
Jeremy Bernier
sumber
3
window.onscroll = function(ev) {
    if ((window.innerHeight + Math.ceil(window.pageYOffset)) >= document.body.offsetHeight) {
        alert("you're at the bottom of the page");
    }
};

Jawaban ini akan memperbaiki kasus tepi, hal ini dikarenakan pageYOffsetadalah doublesementara innerHeightdan offsetHeightyanglong , jadi ketika browser memberikan info, Anda mungkin pendek pixel. Misalnya: di bagian bawah halaman yang kita miliki

benar window.innerHeight = 10.2

benar window.pageYOffset = 5.4

benar document.body.offsetHeight = 15.6

Perhitungan kami kemudian menjadi: 10 + 5,4> = 16 yang mana salah

Untuk memperbaiki ini bisa kita lakukan Math.ceilpadapageYOffset nilai.

Semoga itu bisa membantu.

itay yahalom
sumber
3

jika Anda suka jquery

$(window).scroll(function() {
  if($(window).scrollTop() + $(window).height() >= $(document).height()) {
    // doSomethingHere();
  }
});
Eka putra
sumber
Dan siapa yang tidak suka jQuery ...
Josh Habdas
2
@JoshHabdas browser
Toni Michel Caubet
2

Anda dapat melihat gulir tak terbatas jquery:

http://www.infinite-scroll.com/infinite-scroll-jquery-plugin/

Yang sepertinya melakukan apa yang Anda minta, dengan asumsi Anda bersedia menggunakan perpustakaan jquery dan tidak berharap untuk metode JS murni yang ketat.

Kai Qing
sumber
2
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
bobthedeveloper
@Hatsjoem Dia menautkan ke plugin. Apa sebenarnya "bagian penting" yang harus disalin? Siapa yang peduli jika jawabannya "menjadi tidak valid jika halaman tertaut berubah"? Jika tautan menjadi rusak, itu artinya plugin tersebut dihentikan dan tidak ada lagi - bahkan jika Anda menambahkan lebih banyak info ke jawabannya, itu masih tidak valid. Ya ampun, jawaban hanya tautan tidak selalu buruk.
dcastro
@Hatsjoem Juga, dari meta : "Ketika perpustakaan yang dirujuk berada di lokasi yang terkenal dan stabil, jawaban semacam ini umumnya merupakan jawaban yang buruk tetapi jawaban tetap : ia mengatakan" gunakan ini "."
dcastro
Plus, Google mungkin masih ada jika gulir yang tak terbatas mengubah URL ini. Intinya adalah menggunakan plugin itu jadi jika tautannya mati, cukup cari google jquery scroll tak terbatas. Anda mungkin akan menemukan yang Anda butuhkan.
Kai Qing
2

Anehnya tidak ada solusi yang bekerja untuk saya. Saya pikir itu karena saya csskacau, dan bodytidak membungkus semua konten saat menggunakan height: 100%(belum tahu mengapa). Namun saat mencari solusi saya telah datang dengan sesuatu yang baik ... pada dasarnya sama, tapi mungkin ada baiknya untuk melihat - Saya baru ke pemrograman jadi maaf jika itu melakukan lebih lambat yang sama, kurang didukung atau sesuatu seperti bahwa...

window.onscroll = function(evt) {
  var check = (Element.getBoundingClientRect().bottom - window.innerHeight <= 0) ? true : false;
  if (check) { console.log("You're at the bottom!"); }
};
Coldark
sumber
2
$(document).ready(function(){
    $('.NameOfYourDiv').on('scroll',chk_scroll);
});

function chk_scroll(e)
{
    var elem = $(e.currentTarget);
    if (elem[0].scrollHeight - elem.scrollTop() == elem.outerHeight()) 
    {
        alert("scrolled to the bottom");
    }

}
Zihan Zhang
sumber
idk perspektif yang berbeda. Tapi jawaban yang diterima pasti lebih baik
Zihan Zhang
2
const handleScroll = () => {
    if (Math.round(window.scrollY + window.innerHeight) >= Math.round(document.body.scrollHeight)) {
        onScroll();
    }
};

Kode ini juga berfungsi untuk saya di Firefox dan IE.

Arokia Prabha
sumber
1

Menggunakan defaultViewdan documentElementdengan cuplikan kode fungsional tertanam:

const { defaultView } = document;
const { documentElement } = document;
const handler = evt => requestAnimationFrame(() => {
  const hitBottom = (() => (defaultView.innerHeight + defaultView.pageYOffset) >= documentElement.offsetHeight)();
  hitBottom
    ? console.log('yep')
    : console.log('nope')
});
document.addEventListener('scroll', handler);
<pre style="height:110vh;background-color:fuchsia">scroll down</pre>

Josh Habdas
sumber
1

Anda dapat memeriksa apakah hasil gabungan dari ketinggian jendela dan gulir atas lebih besar daripada tubuh

if (window.innerHeight + window.scrollY >= document.body.scrollHeight) {}

Oussama Essamadi
sumber
0

Saya harus menemukan cara (di Jawa) untuk secara sistematis gulir ke bawah mencari komponen yang saya tidak tahu XPath yang benar (cerita panjang, jadi mainkan saja). Seperti yang baru saja saya nyatakan, saya perlu menggulir ke bawah sambil mencari komponen dan berhenti baik ketika komponen itu ditemukan atau bagian bawah halaman tercapai.

Cuplikan kode berikut mengontrol gulir ke bawah ke bagian bawah halaman:

JavascriptExecutor js = (JavascriptExecutor) driver;
boolean found = false;
long currOffset = 0;
long oldOffset = 0;
do
{
    oldOffset = currOffset;
    // LOOP to seek the component using several xpath regexes removed
    js.executeScript("window.scrollBy(0, 100)");
    currOffset = (Long)js.executeScript("var offset = window.window.pageYOffset; return offset;");
} while (!found && (currOffset != oldOffset));

By the way, jendela dimaksimalkan sebelum potongan kode ini dieksekusi.

hfontanez
sumber
0

Jawaban yang diterima tidak berhasil untuk saya. Ini berhasil:

const element = document.createElement('div');
document.body.appendChild(element);
document.addEventListener('scroll', () => {
    const viewportHeight = window.innerHeight;
    const distance = element.getBoundingClientRect().top;
    if (Math.floor(distance) <= viewportHeight) {
        console.log('yep')
    } else {
        console.log('nope')
    }
})
mqliutie
sumber
0

Dua solusi yang saya temukan bekerja untuk saya:

  window.addEventListener('scroll', function(e) {
    if (
      window.innerHeight + document.documentElement.scrollTop ===
      document.documentElement.offsetHeight
    ) {
      console.log('You are at the bottom')
    }
  })

Dan lainnya:

  window.addEventListener('scroll', function(e) {
    if (
      window.innerHeight + window.pageYOffset ===
      document.documentElement.offsetHeight
    ) {
      console.log('You are at the bottom')
    }
  })
Dgn sangat hati-hati
sumber