Software developers wanting to implement infinite scroll can easily get started with the browser's IntersectionObserver
callback function.
As a working example, we could create a component for use on a blogging site which automatically fetches another article when the reader has reached the end of the original article.
Here's what the code looks like:
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting == true) {
fetchNextArticle();
}
}, {threshold: 0});
const bottomOfPage = document.querySelect('#bottom-of-page');
observer.observe(bottomOfPage);
There isn't much to it. The bottom-of-page
element could be any HTML element, but in its simplest form it is just a clear div
, that has non-zero dimensions, situated somewhere after the original article's content.
The observer is called when the reader scrolls to a point where the target div
becomes visible. A threshold
value of 0
will trigger the callback when any part of the div
is in the viewport. A threshold
value of 1
will only trigger it when all of the div
is in the viewport.
The fetchNextArticle
function is where the just-in-time loading happens:
const articleUrls = [
'/feb-28-2021.html',
'/feb-21-2021.html',
'/feb-14-2021.html',
'/feb-07-2021.html'
];
const nextIndex = 0;
async fetchNextArticle() {
// fetch the article using HTTP
const response = await fetch(articleUrls[nextIndex++]);
if (response.status != 200 && response.status != 304)
return;
const templateText = await response.text();
// get the <body> of the article's HTML
const template = document.createElement('template');
template.innerHTML = templateText;
const body = template.content.querySelector('body');
// create a new <article> and insert it
const nextArticle = document.createElement('article')
nextArticle.innerHTML = body.innerHTML;
bottomOfPage.parentNode.insertBefore(nextArticle, bottomOfPage);
}
In this example, there are four articles that are queued for just-in-time loading. Of course in practice, that queue should be dynamically built to match the reader's interests.
This bare-bones example is a good starting point, but savvy developers can easily imagine improvements:
Querying the next article's <title> and <meta> tags to extract open graph data, like featured image, dateline, byline, and lede paragraph.
Removing unnecessary headers, footers, menus and advertising links from the article's <body>.
Giving the reader a way to toggle between two views of the article: a collapsed UI card and an expanded full-text view.
All of this has been implemented in the rwt-piqueme DOM component, which is ready-to-use via NPM.
(An expanded version of this article originally appeared on Medium.)
Top comments (0)