Skip to content

Instantly share code, notes, and snippets.

@zudsniper
Forked from evarouss/infiniteScrolling
Last active September 5, 2023 12:35
Show Gist options
  • Save zudsniper/6f1cc0bfc498552ddc685a0585768f17 to your computer and use it in GitHub Desktop.
Save zudsniper/6f1cc0bfc498552ddc685a0585768f17 to your computer and use it in GitHub Desktop.
Infinite Scrolling UserScript?
// ==UserScript==
// @name Gist Infinite Scroll
// @namespace https://gist.github.com/*
// @version 0.1
// @description Infinite Scroll on github gists
// @author Jason McElhenney
// @match http://gist.github.com/* // Adjust this to match the websites you want the script to run on
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @require https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==
(function() {
'use strict';
// js file
var next_data_url; // replaced when loading more
var prev_data_url; // replaced when loading more
var next_data_cache;
var prev_data_cache;
var last_scroll = 0;
var is_loading = 0; // simple lock to prevent loading when loading
var hide_on_load = false; // ID that can be hidden when content has been loaded
function loadFollowing() {
if (next_data_url=="") {
$('div.pagination').show();
} else {
is_loading = 1; // note: this will break when the server doesn't respond
$('div.pagination').hide();
function showFollowing(data) {
$('div.listitempage:last').after(data.response);
next_data_url = data.next_data_url;
next_data_cache = false;
$.getJSON(next_data_url, function(preview_data) {
next_data_cache = preview_data;
});
}
if (next_data_cache) {
showFollowing(next_data_cache);
is_loading = 0;
} else {
$.getJSON(next_data_url, function(data) {
showFollowing(data);
is_loading = 0;
});
}
}
};
function loadPrevious() {
if (prev_data_url=="") {
$('div.pagination').show();
} else {
is_loading = 1; // note: this will break when the server doesn't respond
$('div.pagination').hide();
function showPrevious(data) {
$('div.listitempage:first').before(data.response);
item_height = $("div.listitempage:first").height();
window.scrollTo(0, $(window).scrollTop()+item_height); // adjust scroll
prev_data_url = data.prev_data_url;
prev_data_cache = false;
$.getJSON(prev_data_url, function(preview_data) {
prev_data_cache = preview_data;
});
if (hide_on_load) {
$(hide_on_load).hide();
hide_on_load = false;
}
}
if (prev_data_cache) {
showPrevious(prev_data_cache);
is_loading = 0;
} else {
$.getJSON(prev_data_url, function(data) {
showPrevious(data);
is_loading = 0;
});
}
}
};
function mostlyVisible(element) {
// if ca 25% of element is visible
var scroll_pos = $(window).scrollTop();
var window_height = $(window).height();
var el_top = $(element).offset().top;
var el_height = $(element).height();
var el_bottom = el_top + el_height;
return ((el_bottom - el_height*0.25 > scroll_pos) &&
(el_top < (scroll_pos+0.5*window_height)));
}
function initPaginator() {
$(window).scroll(function() {
// handle scroll events to update content
var scroll_pos = $(window).scrollTop();
if (scroll_pos >= 0.9*($(document).height() - $(window).height())) {
if (is_loading==0) loadFollowing();
}
if (scroll_pos <= 0.9*$("#header").height()) {
if (is_loading==0) loadPrevious();
}
// Adjust the URL based on the top item shown
// for reasonable amounts of items
if (Math.abs(scroll_pos - last_scroll)>$(window).height()*0.1) {
last_scroll = scroll_pos;
$(".listitempage").each(function(index) {
if (mostlyVisible(this)) {
history.replaceState(null, null, $(this).attr("data-url"));
$("#pagination").html($(this).attr("data-pagination"));
return(false);
}
});
}
});
$(document).ready(function () {
// if we have enough room, load the next batch
if ($(window).height()>$("#scrollingcontent").height()) {
if (next_data_url!="") {
loadFollowing();
} else {
var filler = document.createElement("div");
filler.id = "filler";
filler.style.height = ($(window).height() -
$("#scrollingcontent").height())+ "px";
$("#scrollingcontent").after(filler);
hide_on_load = "filler";
}
}
// scroll down to hide empty room
head_height = $("#header").height();
window.scrollTo(0, head_height);
});
}
function primeCache() {
$.getJSON(prev_data_url, function(data) { prev_data_cache=data; } );
$.getJSON(next_data_url, function(data) { next_data_cache=data; } );
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment