だから私はこの問題を読んでいて、かなり多くの異なる解決策を見てきました. 現時点では、私のコードは次のようになります。
私はこのプラグインを使用しています: http://benalman.com/projects/jquery-throttle-debounce-plugin/
// Bind throttled scroll event to load new items when page is scrolled to the bottom.
$(window).data('loading', false).scroll($.throttle(800, Olemas.ScrollLoad));
Olemas.ScrollLoad = function() {
if ($(window).data('loading') == true) return;
if ($(window).scrollTop() >= ($(document).height() - $(window).height())) {
if (Olemas.NextPage <= Olemas.MaxPage) {
$(window).unbind('scroll'); // I have tried unbinding the event to stop it from launching
Olemas.LoadMoreItems(Olemas.DivToUpdate); // load the new items
$(window).data('loading', false).scroll($.throttle(800, Olemas.ScrollLoad)); // rebind scroll event.
}
}
};
問題は、イベントが 800 ミリ秒ごとに発生しているにもかかわらずです。一番下までスクロールすると、スクロールイベントが何度も発生し、ページがすべて間違って読み込まれます。
if ($(window).scrollTop() >= ($(document).height() - $(window).height()))
このステートメントは、アイテムがページに読み込まれた後は通過するべきではありませんが、ページの高さが変更されたことを認識する前に数回通過します。高さ属性が十分に速く更新されていないか、スクロール イベントが何らかの形で既に DOM に読み込まれている可能性はありますか?
LoadMoreItems 関数がページを展開した後にスクロール イベントが発生しないようにするにはどうすればよいですか。
編集。
したがって、この関数では、アラートが 2 回実行されてから、LoadMoreItems ajax 成功でアラートが実行されます。
Olemas.ScrollLoad = function() {
/// <summary>
/// Loads more items when scrolled to the bottom.
/// </summary>
if ($(window).data('loading') == true) return;
if ($(window).scrollTop() >= ($(document).height() - $(window).height())) {
if (Olemas.NextPage <= Olemas.MaxPage) {
alert(Olemas.NextPage); // This runs 2 times, before the LoadMoreItems changes the NextPage value
$(window).off('scroll', $.throttle(800, Olemas.ScrollLoad));
Olemas.LoadMoreItems(Olemas.DivToUpdate);
$(window).data('loading', false).on('scroll', $.throttle(800, Olemas.ScrollLoad)); // rebind scroll event.
}
}
};
Olemas.LoadMoreItems = function () {
$(window).data('loading', true);
$.ajax({
url: Olemas.ActionLink,
data: { "page": Olemas.NextPage, "facId": Olemas.FacultyId },
success: function (data) {
$(".loadingImage").hide();
$(data).appendTo(Olemas.DivToUpdate);
alert("Done") // This is run after the previous alerts have fired 2 times.
Olemas.NextPage++;
Olemas.CheckPages();
}
});
return false;
};