// https://forum.vuejs.org/t/how-to-use-helper-functions-for-imported-modules-in-vuejs-vue-template/6266/5 export default { directives: { lazy: { bind (figure, binding) { // console.log('directive lazy bind', figure, binding) // show only the first image if (binding.value === 0) { const img = figure.querySelector('img:not(.blank)') figure.classList.add('loading') img.addEventListener('load', function (e) { // console.log('img loaded', e) figure.classList.remove('loading') figure.classList.add('loaded') }) img.addEventListener('error', function (e) { console.error('img ERROR', e) e.target.classList.remove('loading') e.target.classList.add('error') }) img.setAttribute('src', img.getAttribute('data-src')) // img.removeAttribute('data-src') // img.classList.remove('lazy') } } }, switcher: { inserted (el, binding) { // switch images on mousemove el.addEventListener('mousemove', function (event) { const figs = this.querySelectorAll('figure.loaded') // console.log('mousemove', figs.length, this, event) // let len = figs.length // let w = this.clientWidth; // let g = w / len; // let delta = Math.floor(event.layerX / g) // console.log(event.offsetX, this.clientWidth, figs.length) // console.log(event.offsetX / (this.clientWidth / figs.length)) let delta = Math.floor(event.offsetX / (this.clientWidth / figs.length)) delta = delta < 0 ? 0 : delta >= figs.length ? figs.length - 1 : delta // console.log('delta', delta) figs.forEach((fig, index) => { // console.log(index) if (index === delta) { // fig.style.display = "block" fig.classList.remove('hide') fig.classList.add('show') } else { // fig.style.display = "none" fig.classList.remove('show') fig.classList.add('hide') } }) }) } } }, mounted () { // lazy load images on mouseover // console.log('card mounted', this.$options.name) // if (this.$options.name ==! 'ModalCard') { this.activateLazyLoad() // } }, updated () { // lazy load images on mouseover // console.log('card updated', this.$options.name) // if (this.$options.name ==! 'ModalCard') { this.activateLazyLoad() // } }, methods: { // used by ModalCard activateLazyLoad () { // console.log('card activateLazyLoad', this.$options.name) this.$el.addEventListener('mouseover', function (event) { const figures = this.querySelectorAll('.images figure.lazy:not(.loaded):not(.loading)') console.log('mouseover', this, figures) figures.forEach((figure, index) => { const img = figure.querySelector('img:not(.blank)') // console.log('forEach img',img) img.classList.add('loading') img.addEventListener('load', function (e) { // console.log('img loaded', e) figure.classList.remove('loading') figure.classList.add('loaded') }) img.addEventListener('error', function (e) { console.error('img ERROR', figure, e) }) const src = img.getAttribute('data-src') // for debug purpose console.log(figures.length, index) // let src = img.getAttribute('data-src') // if (index > 0 && index < figures.length - 1) { // src = img.getAttribute('data-src').replace('?', '/bad?') // } img.setAttribute('src', src) // img.removeAttribute('data-src') // img.classList.remove('lazy') }) }, { once: true }) } } }