You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
var spy = function () {
|
|
var elems = document.querySelectorAll(Array.from(Array(6).keys(), x => ".post-body h"+(x+1).toString()));
|
|
// ":is()" was not supported until Chrome 88+
|
|
// Here is a backfill
|
|
if (elems.length == 0) {
|
|
return;
|
|
}
|
|
var supportPageOffset = window.pageXOffset !== undefined;
|
|
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
|
|
|
|
var currentTop = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
|
|
var currentBottom = currentTop + window.height;
|
|
var pageBottom = window.pageBottom;
|
|
|
|
var meetUnread = false
|
|
let lastElemName = elems[elems.length - 1].id;
|
|
elems.forEach(function (elem, idx) {
|
|
var elemTop = elem.offsetTop;
|
|
var id = elem.getAttribute('id');
|
|
var navElems = document.getElementsByClassName("nav-"+id);
|
|
if (navElems.length == 0) {
|
|
return
|
|
}
|
|
if (currentTop >= elemTop || currentBottom >= pageBottom) {
|
|
Array.from(navElems).forEach((e) => {
|
|
e.classList.add('toc-active');
|
|
});
|
|
} else {
|
|
if (meetUnread == false) {
|
|
meetUnread = true;
|
|
if (idx > 0) {
|
|
lastElemName = elems[idx - 1].id;
|
|
}
|
|
}
|
|
Array.from(navElems).forEach((e) => {
|
|
e.classList.remove('toc-active');
|
|
});
|
|
}
|
|
})
|
|
let selector = ".nav-" + lastElemName;
|
|
// Two toc elements here
|
|
document.querySelectorAll(selector).forEach(e => {
|
|
e.scrollIntoView({ block: "center", behavior: 'smooth' });
|
|
});
|
|
}
|