Ad
InView Is Not Defined Lazy-instant-render.js
My website has a large number of photographs on the first page which is slowing down the performance of the page and making the load time far too long. To combat this I found lazy-instant-render.js which will prevent all images from loading when the page is ready. I get this error in console: inView is not defined.
// Performance tests such as Google Lighthouse often complain about below the fold images while lazy loading
// techniques may introduce a flash effect for images on bigger screens
// This snippet shows a solution to instantly display images as if loaded using src="" while maintaining
// the lazy loading benefit on smaller screens.
// Tip: a second and potentially better technique is to rewrite lazy loaded images to regular src="" images in a Service Worker.
// this snippet depends on in-view (5kb)
// @link https://github.com/camwiegert/in-view/
// tiny cross browser domready method
// @link https://gist.github.com/dciccale/4087856
var DOMReady = function(a,b,c){b=document,c='addEventListener';b[c]?b[c]('DOMContentLoaded',a):window.attachEvent('onload',a)}
// requestAnimationframe
var RAF = window.requestAnimationframe || setTimeout;
var lazyToken = 'data-lzy';
// display image
var lazyResolve = function(el) {
// already loaded
if (!el.hasAttribute(lazyToken)) {
return;
}
// verify if image is hidden by parent
if (el.offsetParent !== null) {
// remove lazy marker (to mark as completed)
el.removeAttribute(lazyToken);
// requestAnimationFrame to prevent layout trashing
RAF(function() {
el.setAttribute('src', el.getAttribute(lazyToken));
});
}
}
// setup lazy load method
DOMReady(function() {
inView('['+lazyToken+']').on('enter', lazyResolve);
});
// instantly load visible images on render
var mutationObserver = window.MutationObserver || window.WebKitMutationObserver,
observer;
if (mutationObserver) {
observer = new mutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var node;
for (var i = 0; i < mutation.addedNodes.length; i++) {
node = mutation.addedNodes[i];
if (node.nodeName === 'IMG' && node.hasAttribute(lazyToken)) {
if (inView.is(node)) {
// start download
new Image().src = node.getAttribute(lazyToken);
// display image with requestAnimationFrame
lazyResolve(node);
}
}
}
});
});
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
}
Ad
Answer
You could use the new the standard loading="lazy"-attribute functionality to lazy load images (and iframes if needed). Additionally to support older browsers as well, you could use the polyfill that I‘ve developed for this aspect: https://github.com/mfranzke/loading-attribute-polyfill
Ad
source: stackoverflow.com
Related Questions
- → How to update data attribute on Ajax complete
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → Octobercms Component Unique id (Twig & Javascript)
- → Passing a JS var from AJAX response to Twig
- → Laravel {!! Form::open() !!} doesn't work within AngularJS
- → DropzoneJS & Laravel - Output form validation errors
- → Import statement and Babel
- → Uncaught TypeError: Cannot read property '__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED' of undefined
- → React-router: Passing props to children
- → ListView.DataSource looping data for React Native
- → Can't test submit handler in React component
- → React + Flux - How to avoid global variable
- → Webpack, React & Babel, not rendering DOM
Ad