Skip to content

Instantly share code, notes, and snippets.

@aschiavon91
Last active January 30, 2020 12:03
Show Gist options
  • Select an option

  • Save aschiavon91/7d6b1da3b9828bb4fb44c6acd00f9742 to your computer and use it in GitHub Desktop.

Select an option

Save aschiavon91/7d6b1da3b9828bb4fb44c6acd00f9742 to your computer and use it in GitHub Desktop.
<img data-defer-src="">
(function () {
var Elp = Element.prototype;
var observer = new IntersectionObserver(function (entries, observer) {
entries.forEach(function (entry) {
if (!entry.target || entry.target.tagName.toUpperCase() !== 'IMG') {
return;
}
var img = entry.target;
var rect = entry.intersectionRect;
var src = img.getAttribute('data-defer-src');
if (src && rect.width > 0 && rect.height > 0) {
img.setAttribute('src', src);
img.removeAttribute('data-defer-src');
}
});
}, {
root: null, rootMargin: '0px', threshold: 0
});
// Observe whatever is on the page already
(function () {
var imgs = document.body.getElementsByTagName('img');
imgs = Array.from(imgs);
imgs.forEach(function (img) {
observer.observe(img);
});
})();
// Override innerHTML
var originalSet = Object.getOwnPropertyDescriptor(Elp, 'innerHTML').set;
var originalGet = Object.getOwnPropertyDescriptor(Elp, 'innerHTML').get;
Object.defineProperty(Elp, 'innerHTML', {
set: function (html) {
var element = document.createElement('div');
originalSet.call(element, html);
var imgs = element.getElementsByTagName('img');
var found = false;
imgs = Array.from(imgs);
imgs.forEach(function (img) {
var src = img.getAttribute('src');
if (src) {
img.setAttribute('data-defer-src', src);
img.removeAttribute('src');
found = true;
}
});
if (!found) {
originalSet.call(this, html);
return html;
}
originalSet.call(this, originalGet.call(element));
var imgs2 = this.getElementsByTagName('img');
imgs2 = Array.from(imgs);
imgs2.forEach(function (img) {
observer.observe(img);
});
},
get: originalGet
});
// Override insertBefore
var Elp_insertBefore = Elp.insertBefore;
Elp.insertBefore = function (element, ref) {
var imgs = null;
if (!element) {
return;
}
if (element.tagName && element.tagName.toUpperCase() === 'IMG') {
imgs = [element];
} else {
imgs = element.getElementsByTagName('img');
imgs = Array.from(imgs);
}
var found = false;
imgs.forEach(function (img) {
var src = img.getAttribute('src');
if (src) {
img.setAttribute('data-defer-src', src);
img.removeAttribute('src');
observer.observe(img);
found = true;
}
});
return Elp_insertBefore.apply(this, arguments);
};
// Override appendChild
['insertBefore', 'appendChild'].forEach(function (fn) {
var orig = Elp[fn];
Elp[fn] = function (element) {
var imgs = null;
if (!element) {
return;
}
if (element.tagName && element.tagName.toUpperCase() === 'IMG') {
imgs = [element];
} else {
imgs = element.getElementsByTagName('img');
}
var found = false;
imgs.forEach(function (img) {
var src = img.getAttribute('src');
if (src) {
img.setAttribute('data-defer-src', src);
img.removeAttribute('src');
observer.observe(img);
found = true;
}
});
return orig.apply(this, arguments);
};
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment