|
| 1 | +/*! |
| 2 | + * DLL.js v1.5.2 (https://thednp.github.io/dll.js/) |
| 3 | + * Copyright 2020 © thednp |
| 4 | + * Licensed under MIT (https://github.com/thednp/dll.js/blob/master/LICENSE) |
| 5 | + */ |
| 6 | +function queryElement (selector, parent) { |
| 7 | + var lookUp = parent && parent instanceof Element ? parent : document; |
| 8 | + return selector instanceof Element ? selector : lookUp.querySelector(selector); |
| 9 | +} |
| 10 | + |
| 11 | +function tryWrapper (fn,origin){ |
| 12 | + try{ fn(); } |
| 13 | + catch(e){ |
| 14 | + console.error((origin + ": " + e)); |
| 15 | + } |
| 16 | +} |
| 17 | + |
| 18 | +function on (element, event, handler, options) { |
| 19 | + options = options || false; |
| 20 | + element.addEventListener(event, handler, options); |
| 21 | +} |
| 22 | + |
| 23 | +function off (element, event, handler, options) { |
| 24 | + options = options || false; |
| 25 | + element.removeEventListener(event, handler, options); |
| 26 | +} |
| 27 | + |
| 28 | +function one (element, event, handler, options) { |
| 29 | + on(element, event, function handlerWrapper(e){ |
| 30 | + if (e.target === element) { |
| 31 | + handler(e); |
| 32 | + off(element, event, handlerWrapper, options); |
| 33 | + } |
| 34 | + }, options); |
| 35 | +} |
| 36 | + |
| 37 | +function loadMedia(mediaElement, imageCallback) { |
| 38 | + var isVideo = mediaElement.tagName === 'SOURCE', |
| 39 | + loadEvent = isVideo ? 'loadstart' : 'load', |
| 40 | + newVideo = isVideo ? document.createElement('VIDEO') : 0, |
| 41 | + mediaObject = isVideo ? document.createElement('SOURCE') : new Image(), |
| 42 | + loadTarget = isVideo ? newVideo : mediaObject, |
| 43 | + src = mediaElement.getAttribute('data-src'); |
| 44 | + one(loadTarget,loadEvent,function (){ |
| 45 | + if (mediaElement.tagName === 'IMG') { mediaElement.src=src; } |
| 46 | + else if (mediaElement.tagName === 'SOURCE') { |
| 47 | + mediaElement.src=src; |
| 48 | + mediaElement.parentNode.load(); |
| 49 | + } |
| 50 | + else {mediaElement.style.backgroundImage = 'url("'+src+'")'; } |
| 51 | + mediaElement.removeAttribute('data-src'); |
| 52 | + imageCallback && imageCallback(); |
| 53 | + }); |
| 54 | + mediaObject.src = src; |
| 55 | + newVideo && ( newVideo.appendChild(mediaObject) ); |
| 56 | +} |
| 57 | + |
| 58 | +function getMediaElements(source) { |
| 59 | + var queue, mediaItems = [], |
| 60 | + matchedSelectors = source.querySelectorAll('[data-src]'), |
| 61 | + elementSRC = source ? source.getAttribute('data-src') : null; |
| 62 | + if ( elementSRC && !matchedSelectors) { |
| 63 | + queue = [source]; |
| 64 | + } else if ( !elementSRC && matchedSelectors ) { |
| 65 | + queue = matchedSelectors; |
| 66 | + } else if ( elementSRC && matchedSelectors ){ |
| 67 | + queue = matchedSelectors; |
| 68 | + mediaItems.unshift(source); |
| 69 | + } else if ( !elementSRC && !matchedSelectors ){ |
| 70 | + queue = document.querySelectorAll('[data-src]'); |
| 71 | + } |
| 72 | + Array.from(queue).map(function (x){ return mediaItems.push(x); }); |
| 73 | + return mediaItems; |
| 74 | +} |
| 75 | + |
| 76 | +function DLL (element,callbackFn){ |
| 77 | + tryWrapper(function (){ |
| 78 | + element = queryElement(element); |
| 79 | + callbackFn = typeof callbackFn === 'function' ? callbackFn : null; |
| 80 | + var mediaTargets = getMediaElements(element), |
| 81 | + elementSRC = element ? element.getAttribute('data-src') : null; |
| 82 | + if (elementSRC || element.querySelector('[data-src]') !== null) { |
| 83 | + mediaTargets.map(function (x,i){ |
| 84 | + if ( i === mediaTargets.length-1 && callbackFn) { |
| 85 | + loadMedia(x,callbackFn); |
| 86 | + } else { |
| 87 | + loadMedia(x); |
| 88 | + } |
| 89 | + }); |
| 90 | + } |
| 91 | + },'DLL.js:'); |
| 92 | +} |
| 93 | + |
| 94 | +function initComponent() { |
| 95 | + var DLLImages = Array.from(document.querySelectorAll('[data-src]')); |
| 96 | + DLLImages.map(function (x){ return new DLL(x); }); |
| 97 | +} |
| 98 | +document.body ? initComponent() : one(document, 'DOMContentLoaded', initComponent); |
| 99 | + |
| 100 | +export default DLL; |
0 commit comments