Repository URL to install this package:
|
Version:
1.0.1 ▾
|
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("./utils");
exports.observerElementsMap = new Map();
function getPooled(options = {}) {
const root = options.root || null;
const rootMargin = utils_1.parseRootMargin(options.rootMargin);
const threshold = Array.isArray(options.threshold)
? options.threshold
: [options.threshold !== null ? options.threshold : 0];
const observers = exports.observerElementsMap.keys();
let observer;
while ((observer = observers.next().value)) {
const unmatched = root !== observer.root ||
rootMargin !== observer.rootMargin ||
utils_1.shallowCompare(threshold, observer.thresholds);
if (!unmatched) {
return observer;
}
}
return null;
}
exports.getPooled = getPooled;
function findObserverElement(observer, entry) {
const elements = exports.observerElementsMap.get(observer);
if (elements) {
const values = elements.values();
let element;
while ((element = values.next().value)) {
if (element.target === entry.target) {
return element;
}
}
}
return null;
}
exports.findObserverElement = findObserverElement;
/**
* The Intersection Observer API callback that is called whenever one element,
* called the target, intersects either the device viewport or a specified element.
* Also will get caled whenever the visibility of the target element changes and
* crosses desired amounts of intersection with the root.
* @param {array} changes
* @param {IntersectionObserver} observer
*/
function callback(changes, observer) {
for (let i = 0; i < changes.length; i++) {
const element = findObserverElement(observer, changes[i]);
if (element) {
element.handleChange(changes[i]);
}
}
}
exports.callback = callback;
function createObserver(options) {
return getPooled(options) || new IntersectionObserver(callback, options);
}
exports.createObserver = createObserver;
function observeElement(element) {
if (!exports.observerElementsMap.has(element.observer)) {
exports.observerElementsMap.set(element.observer, new Set());
}
exports.observerElementsMap.get(element.observer).add(element);
element.observer.observe(element.target);
}
exports.observeElement = observeElement;
function unobserveElement(element) {
if (exports.observerElementsMap.has(element.observer)) {
const targets = exports.observerElementsMap.get(element.observer);
if (targets.delete(element)) {
if (targets.size > 0) {
element.observer.unobserve(element.target);
}
else {
element.observer.disconnect();
exports.observerElementsMap.delete(element.observer);
}
}
}
}
exports.unobserveElement = unobserveElement;
//# sourceMappingURL=observer.js.map