vanilla-lazyload
Version:
A fast, lightweight script to load images as they enter the viewport. SEO friendly, it supports responsive images (both srcset + sizes and picture) and progressive JPEG
52 lines (42 loc) • 1.81 kB
JavaScript
import { addClass, removeClass } from "./lazyload.class";
import { callbackIfSet } from "./lazyload.callback";
const genericLoadEventName = "load";
const mediaLoadEventName = "loadeddata";
const errorEventName = "error";
const addEventListener = (element, eventName, handler) => {
element.addEventListener(eventName, handler);
};
const removeEventListener = (element, eventName, handler) => {
element.removeEventListener(eventName, handler);
};
const addAllEventListeners = (element, loadHandler, errorHandler) => {
addEventListener(element, genericLoadEventName, loadHandler);
addEventListener(element, mediaLoadEventName, loadHandler);
addEventListener(element, errorEventName, errorHandler);
};
const removeAllEventListeners = (element, loadHandler, errorHandler) => {
removeEventListener(element, genericLoadEventName, loadHandler);
removeEventListener(element, mediaLoadEventName, loadHandler);
removeEventListener(element, errorEventName, errorHandler);
};
const eventHandler = function(event, success, instance) {
var settings = instance._settings;
const className = success ? settings.class_loaded : settings.class_error;
const callback = success ? settings.callback_load : settings.callback_error;
const element = event.target;
removeClass(element, settings.class_loading);
addClass(element, className);
callbackIfSet(callback, element);
instance._updateLoadingCount(-1);
};
export const addOneShotEventListeners = (element, instance) => {
const loadHandler = event => {
eventHandler(event, true, instance);
removeAllEventListeners(element, loadHandler, errorHandler);
};
const errorHandler = event => {
eventHandler(event, false, instance);
removeAllEventListeners(element, loadHandler, errorHandler);
};
addAllEventListeners(element, loadHandler, errorHandler);
};