Kiểm tra xem người dùng đã cuộn xuống phía dưới chưa


667

Tôi đang tạo một hệ thống phân trang (giống như Facebook) nơi tải nội dung khi người dùng cuộn xuống phía dưới. Tôi tưởng tượng cách tốt nhất để làm điều đó là tìm khi người dùng ở cuối trang và chạy truy vấn ajax để tải thêm bài đăng.

Vấn đề duy nhất là tôi không biết cách kiểm tra xem người dùng đã cuộn xuống cuối trang bằng jQuery chưa. Có ý kiến ​​gì không?

Tôi cần tìm cách kiểm tra khi người dùng đã cuộn xuống cuối trang bằng jQuery.


Điều đó thật buồn cười, tôi đang cố gắng tìm ra chức năng nào đang được gọi khi tôi cuộn xuống phía dưới, vì vậy tôi có thể chặn "tính năng" đáng giận này.
endolith

Đối với giải pháp React.js, liên kết này có thể giúp: stackoverflow.com/a/53158893/4265546
raksheetbhat

Câu trả lời:


1022

Sử dụng .scroll()sự kiện trên window, như thế này:

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

Bạn có thể kiểm tra nó ở đây , cái này sẽ cuộn cuộn trên cùng của cửa sổ, vì vậy nó cuộn xuống bao nhiêu, thêm chiều cao của cửa sổ hiển thị và kiểm tra xem nó có bằng chiều cao của nội dung tổng thể không ( document). Thay vào đó, nếu bạn muốn kiểm tra xem người dùng có ở gần đáy không, nó sẽ trông giống như thế này:

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

Bạn có thể kiểm tra phiên bản đó tại đây , chỉ cần điều chỉnh nó 100thành bất kỳ pixel nào từ dưới cùng mà bạn muốn kích hoạt.


32
Như thường lệ bạn đến đó trước tôi. Dù sao, với OP, nếu bạn có một thùng chứa các bài đăng, hãy sử dụng ID đó thay vì "cửa sổ", đồng thời, bạn có thể muốn thay đổi .height () thành scrollHeight
Christian

4
Firefox gọi cảnh báo ("dưới cùng!"); nhiều lần (hoạt động tốt với chrome và safari)
Marco Matarazzi

3
đó là một lỗi, nếu bạn thực hiện console.log()thay vì cảnh báo, đôi khi nó lặp lại lệnh.
Jürgen Paul

19
@KevinVella Vella kết hợp tốt là sử dụng cái này với _.debounce () trong tiện ích gạch dưới để ngăn nó bắn cho đến khi người dùng ngừng cuộn - underscorejs.org/#debounce -
JohnnyFaldo

3
@NickCraver có triển khai js thuần túy không?
Dewsworld

116

Câu trả lời của Nick Craver hoạt động tốt, giải quyết vấn đề giá trị $(document).height()thay đổi theo trình duyệt.

Để làm cho nó hoạt động trên tất cả các trình duyệt, hãy sử dụng chức năng này từ James Padolsey :

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
    );
}

thay cho $(document).height(), để mã cuối cùng là:

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

6
Anh ta đã cập nhật với chức năng phiên bản hơi nén getDocHeight () {var D = document; return Math.max (D.body.scrollHeight, D.documentEuity.scrollHeight, D.body.offsetHeight, D.documentEuity.offsetHeight, D.body.clientHeight, D.documentEuity.clientHeight); }
vẽ

thông báo cho tôi khi tôi đạt đến đỉnh, không phải dưới cùng (Chrome).
Damien Roche

Có thể tốt hơn để sử dụng minthay vì max, đặc biệt là nếu có một lề dù sao, để tránh vô tình ngăn người dùng cuộn đến những gì bạn nghĩ là ở dưới cùng của trang.
Solomon Ucko

103

Tôi không chắc chắn tại sao điều này chưa được đăng, nhưng theo tài liệu từ MDN , cách đơn giản nhất là sử dụng các thuộc tính javascript gốc:

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

Trả về true khi bạn ở dưới cùng của bất kỳ phần tử có thể cuộn nào. Vì vậy, chỉ cần sử dụng javascript:

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

scrollHeightcó ủng hộ rộng rãi trong các trình duyệt, từ tức là 8 được chính xác hơn, trong khi clientHeightscrollTopđều được hỗ trợ bởi tất cả mọi người. Ngay cả tức là 6. Đây phải là trình duyệt chéo an toàn.


1
Lưu ý rằng trong một số tình huống điều này có thể không phải là trường hợp. Firefox 47 báo cáo một máy khách textareaHeight là 239 trong khi phương trình trên đưa ra 253 khi cuộn xuống phía dưới. Có lẽ đệm / biên hoặc một cái gì đó đang ảnh hưởng đến nó? Dù bằng cách nào, thêm một số phòng ngọ nguậy sẽ không đau, như thế var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );. Điều này hữu ích cho việc tự động cuộn một trường chỉ khi đã ở dưới cùng (vì vậy người dùng có thể kiểm tra thủ công một phần cụ thể của nhật ký thời gian thực mà không mất vị trí của họ, v.v.).
Beejor

Tôi sẽ nói thêm rằng nó có thể trả về các phủ định sai vì một bên có thể trả về một số thập phân nhỏ trong khi bên kia trả về toàn bộ số (ví dụ: 200.181819304947200). Tôi đã thêm một Math.floor()để giúp giải quyết vấn đề đó nhưng tôi không biết điều này sẽ đáng tin đến mức nào.
Hanna

1
Đối với tôi, điều này không hoạt động trên trình duyệt chéo. Tôi nhận được kết quả hoàn toàn khác nhau trên chrome so với firefox.
Tadej

1
Tôi đã thử điều này trên phần tử <body> và điều này sẽ kích hoạt khi trình duyệt được cuộn lên TOP chứ không phải phía dưới.
Chris Sobolewski

10
Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0(thay thế 3.0 bằng bất kỳ dung sai pixel nào bạn nghĩ là phù hợp với hoàn cảnh của bạn). Đây là con đường để đi vì (A) clientHeight, scrollTopclientHeighttất cả đều tròn mà có thể dẫn đến một lỗi 3px nếu tất cả các class, (B) 3 pixel là hầu như không thể nhìn thấy cho người sử dụng vì vậy người dùng có thể nghĩ rằng cái gì là sai với trang web của bạn khi họ "nghĩ" họ ở cuối trang khi thực tế họ không phải và (C) một số thiết bị nhất định (đặc biệt là những thiết bị không có người ở) có thể có hành vi kỳ quặc khi cuộn.
Jack Giffin

50

Đối với những người sử dụng giải pháp của Nick và nhận được các cảnh báo / sự kiện lặp đi lặp lại, bạn có thể thêm một dòng mã phía trên ví dụ cảnh báo:

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

Điều này có nghĩa là mã sẽ chỉ kích hoạt lần đầu tiên bạn ở trong phạm vi 100px dưới cùng của tài liệu. Nó sẽ không lặp lại nếu bạn cuộn ngược lên rồi lại xuống, điều này có thể hữu ích hoặc không hữu ích tùy thuộc vào việc bạn đang sử dụng mã của Nick để làm gì.


1
Tôi vừa mới nhận xét và cho biết dòng mã đó có liên quan đến câu trả lời của người khác nhưng +1 cho ý định!
Nate-Wilkins

Xin lỗi, tôi không thể (và vẫn không thể) xem cách thêm nhận xét vào câu trả lời (như tôi có thể ở đây)?
Tim Carr

Phải người dùng mới không thể thêm nhận xét vào bài viết trừ khi bạn nhận được nhiều đại diện hơn.
Nate-Wilkins

Trước hết nếu bạn có thể đặt khác nếu kiểm tra xem sự thay đổi mà bạn muốn tập lệnh tồn tại, giả sử một lớp đã được áp dụng cho div. Điều này sẽ làm cho cái thứ hai lồng nhau nếu không chạy nếu nó đã chạy.
1934286

Làm thế nào tôi có thể chọn id id cụ thể thay vì toàn bộ cửa sổ?
James Smith

40

Ngoài câu trả lời được chấp nhận tuyệt vời từ Nick Craver, bạn có thể điều chỉnh sự kiện cuộn để nó không được kích hoạt thường xuyên do đó làm tăng hiệu suất trình duyệt :

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);
}

Có lẽ nên chỉ ra rằng điều này đòi hỏi Underscore.js: underscorejs.org . Đó là một điểm rất tốt, mặc dù. Sự kiện cuộn nên khá nhiều luôn luôn được điều chỉnh để tránh các vấn đề hiệu suất nghiêm trọng.
Jude Osborn

Có thể đó chỉ là tôi và nó có thể sử dụng một số điểm chuẩn, nhưng tôi không thích ý tưởng gọi ClearTimeout và setTimeout trên mỗi sự kiện cuộn. Tôi sẽ phát hành 1 setTimeout và thêm một số vệ sĩ trong trình xử lý đó. Nó có lẽ chỉ là một tối ưu hóa vi mô (nếu có).
Nỗi sợ hãi tuyệt vọng

Đây là một bổ sung thực sự gọn gàng! Tôi có thể nghĩ về một cải tiến hơn nữa. Hiện tại chức năng kiểm tra chiều cao sẽ không chạy nếu người dùng tiếp tục cuộn. Nếu đây là sự cố (ví dụ: bạn muốn kích hoạt chức năng khi người dùng cuộn xuống một nửa bất kể họ có tiếp tục cuộn không), bạn có thể dễ dàng đảm bảo rằng chức năng thực sự được gọi trong khi vẫn cấm nhiều cuộc gọi trong khoảng thời gian đã chọn. Đây là một ý chính để hiển thị nó. gist.github.com/datacarl/7029558
datacarl

Gì? Gọi một tải máy móc để ngăn chặn một phép tính đơn giản? Tôi không thấy cách đó hiệu quả hơn chút nào
Rambatino

37

Câu trả lời của Nick Craver cần được sửa đổi một chút để hoạt động trên iOS 6 Safari Mobile và nên:

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

Thay đổi $ (window) .height () để window.innerHeight nên được thực hiện bởi vì khi thanh địa chỉ được giấu thêm 60px được thêm vào chiều cao của cửa sổ nhưng sử dụng $(window).height()không không phản ánh sự thay đổi này, trong khi sử dụng window.innerHeightthực hiện.

Lưu ý : window.innerHeightThuộc tính cũng bao gồm chiều cao của thanh cuộn ngang (nếu được hiển thị), không giống như $(window).height()chiều cao sẽ không bao gồm chiều cao của thanh cuộn ngang. Đây không phải là vấn đề trong Mobile Safari, nhưng có thể gây ra hành vi không mong muốn trong các trình duyệt khác hoặc các phiên bản tương lai của Mobile Safari. Thay đổi ==để >=có thể khắc phục điều này cho hầu hết các trường hợp sử dụng phổ biến.

Tìm hiểu thêm về window.innerHeighttài sản ở đây


window.innerHeight có ý nghĩa hơn cho những gì tôi đã cố gắng thực hiện nhờ!
Amir5000

Làm thế nào để có được chiều cao còn lại sau khi cuộn?
OPV

20

Đây là một cách tiếp cận khá đơn giản

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

Thí dụ

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

Trường hợp elmlà một phần tử lấy từ tức là document.getElementById.


17

Đây là một đoạn mã sẽ giúp bạn gỡ lỗi mã của mình, tôi đã kiểm tra các câu trả lời ở trên và thấy chúng bị lỗi. Tôi đã kiểm tra các nội dung sau trên Chrome, IE, Firefox, IPad (Safari). Tôi không có bất kỳ người nào khác được cài đặt để kiểm tra ...

<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>

Có thể có một giải pháp đơn giản hơn, nhưng tôi đã dừng lại ở thời điểm CNTT LÀM VIỆC

Nếu bạn vẫn gặp sự cố với một số trình duyệt giả mạo, đây là một số mã giúp bạn gỡ lỗi:

<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;">

Tôi hy vọng điều này sẽ tiết kiệm một số thời gian.


Câu trả lời tốt nhất cho Vanilla js, Không có giải pháp jQuery. Sử dụngvar docElement = document.documentElement; var winElement = window
jperelli

Điều này vào năm 2019. Thay vì winElement.pageYOffsetbạn cũng có thể sử dụng winElement.scrollY.
Noel Abrahams

15

Vui lòng kiểm tra câu trả lời này

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

Bạn có thể làm footerHeight - document.body.offsetHeightđể xem nếu bạn đang ở gần chân trang hoặc đạt đến chân trang


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

Nó tính toán thanh cuộn khoảng cách đến dưới cùng của phần tử. Bằng 0, nếu thanh cuộn đã chạm đáy.


1
Tôi đã làm như sau và làm việc hoàn hảo. Cảm ơn. var nênScroll = (elem.scrollHeight - elem.scrollTop - elem.clientHeight) == 0;
jiminssy

11

Đây là hai xu của tôi:

$('#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');
        }
    });

Đã thử sử dụng giải pháp của bạn, nó hoạt động tốt nhưng trong trường hợp phần tử có phần đệm - nó không hoạt động vì nó tính chiều cao thuần túy của phần tử, không bao gồm phần đệm, để giải quyết điều này tôi đã thay đổi điều này $(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
Taras Chernata

6

Pure JS với trình duyệt chéogỡ lỗi ( Hiệu suất khá tốt )

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)}

Bản trình diễn: http://jsbin.com/geherovena/edit?js,output

PS: Debouncer, getScrollXY, getDocHeightkhông được viết bởi tôi

Tôi chỉ cho thấy cách thức hoạt động của nó, và tôi sẽ làm như thế nào


Hoàn hảo. Đã thử nghiệm trên Firefox và Chrome
Erlisar Vasquez

Tôi nhận được lỗi sau: Dự kiến ​​3 đối số, nhưng đã nhận được 2. Một đối số 'c' không được cung cấp.
Sõber

6

Giải pháp của tôi trong js đồng bằng:

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

Hãy thử điều này cho điều kiện khớp nếu cuộn xuống cuối cùng

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

    //code for your custom logic

}

3

Nick trả lời tốt, nhưng bạn sẽ có các chức năng lặp lại chính nó trong khi cuộn hoặc hoàn toàn không hoạt động nếu người dùng có cửa sổ phóng to. Tôi đã đưa ra một sửa chữa dễ dàng chỉ là math.round chiều cao đầu tiên và nó hoạt động đúng như giả định.

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

3

Bạn có thể thử đoạn mã sau

$("#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

Điều này cho kết quả chính xác, khi kiểm tra phần tử có thể cuộn (nghĩa là không window):

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

offsetHeightphải đưa ra chiều cao có thể nhìn thấy thực tế của một phần tử (bao gồm phần đệm, lề thanh cuộn) và scrollHeighttoàn bộ chiều cao của phần tử bao gồm các vùng vô hình (tràn).

jQueryCác .outerHeight()kết quả tương tự với JS .offsetHeight- tài liệu trong MDN cho offsetHeightkhông rõ ràng về hỗ trợ trình duyệt chéo của nó. Để bao gồm nhiều tùy chọn hơn, điều này là đầy đủ hơn:

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

hãy thử Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeighttrong trường hợp scrollTop là số thập phân mà nó sẽ không hoạt động mà không cóMath.floor()
Michail Michailidis

1

Tất cả các giải pháp này không hoạt động với tôi trên Firefox và Chrome, vì vậy tôi sử dụng các chức năng tùy chỉnh từ Miles O'Keefemeder omulariev như thế này:

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

Đây là hai xu của tôi vì câu trả lời được chấp nhận không có tác dụng với tôi.

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

1

Thay vì nghe sự kiện cuộn, sử dụng Intersection Observer là cách rẻ tiền để kiểm tra xem phần tử cuối cùng có thể nhìn thấy trên khung nhìn hay không (điều đó có nghĩa là người dùng đã được cuộn xuống phía dưới). Nó cũng hỗ trợ cho IE7 với polyfill .

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>


Vấn đề với Intersection Observer là nếu cửa sổ bắt đầu tương đối nhỏ (giả sử bố cục cơ bản trước khi tìm nạp hình ảnh mà không có thanh cuộn) thì cuộc gọi lại của người quan sát được kích hoạt ngay lập tức. Người nghe cuộn thực sự chờ đợi một người để cuộn. Và thanh cuộn sẽ không xuất hiện trước khi lô hình ảnh đầu tiên và vv được tải xuống. Vì vậy, Intersection Observer không phải là tất cả trong một giải pháp.
Aleks

@Aleks Bạn có thể gọi .observe(...)người nghe trên sự kiện như khi người dùng di chuột / chạm vào thùng chứa cuộn của bạn để nó không kích hoạt ngay lập tức.
StefansArya

0

Hãy để tôi hiển thị phê duyệt mà không có JQuery. Hàm JS đơn giản:

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;
}

Ví dụ ngắn về cách sử dụng nó:

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

5
Điều này không trả lời câu hỏi. Câu hỏi là làm thế nào để phát hiện ra rằng người dùng đã cuộn cửa sổ xuống tận cùng. Mã của bạn đang kiểm tra nếu một yếu tố cụ thể được xem.
Hội trường Peter

0

Tôi đã sử dụng @ddanone trả lời và thêm cuộc gọi Ajax.

$('#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

Để dừng cảnh báo lặp đi lặp lại câu trả lời của Nick

ScrollActivate();

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

0

Google Chrome cung cấp chiều cao đầy đủ của trang nếu bạn gọi $(window).height()

Thay vào đó, sử dụng window.innerHeightđể lấy chiều cao của cửa sổ của bạn. Kiểm tra cần thiết phải là:

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

0

Rõ ràng thứ làm việc cho tôi là 'cơ thể' chứ không phải 'cửa sổ' như thế này:

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


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

để sử dụng tương thích trình duyệt chéo:

  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

        );
   }

và sau đó thay vì $ (tài liệu) .height () gọi hàm getheight ()

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


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

để sử dụng gần đáy:

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


if($('body').scrollTop() + $('body').height() > getheight() -100 ) {
    //alert near bottom
 }
 });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.