1
0
mirror of https://github.com/d3/d3.git synced 2025-12-08 19:46:24 +00:00
d3/docs/components/deferRender.js
2023-06-09 09:55:25 -07:00

35 lines
782 B
JavaScript

// TODO Consolidate with PlotRender.
export default function deferRender(node, render) {
let observer;
let idling;
function disconnect() {
if (observer) observer.disconnect();
if (idling) idling = void cancelIdleCallback(idling);
}
const rect = node.getBoundingClientRect();
if (rect.bottom > 0 && rect.top < window.innerHeight) {
render();
} else {
observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
disconnect();
render();
}
},
{rootMargin: "100px"}
);
observer.observe(node);
if (typeof requestIdleCallback === "function") {
idling = requestIdleCallback(() => {
disconnect();
render();
});
}
}
return disconnect;
}