@glidejs/glide
Version:
Glide.js is a dependency-free JavaScript ES6 slider and carousel. It’s lightweight, flexible and fast. Designed to slide. No less, no more
167 lines (140 loc) • 3.3 kB
JavaScript
import { define } from '../utils/object'
import EventsBinder from '../core/event/events-binder'
export default function (Glide, Components, Events) {
/**
* Instance of the binder for DOM Events.
*
* @type {EventsBinder}
*/
const Binder = new EventsBinder()
/**
* Holds detaching status of anchors.
* Prevents detaching of already detached anchors.
*
* @private
* @type {Boolean}
*/
let detached = false
/**
* Holds preventing status of anchors.
* If `true` redirection after click will be disabled.
*
* @private
* @type {Boolean}
*/
let prevented = false
const Anchors = {
/**
* Setups a initial state of anchors component.
*
* @returns {Void}
*/
mount () {
/**
* Holds collection of anchors elements.
*
* @private
* @type {HTMLCollection}
*/
this._a = Components.Html.wrapper.querySelectorAll('a')
this.bind()
},
/**
* Binds events to anchors inside a track.
*
* @return {Void}
*/
bind () {
Binder.on('click', Components.Html.wrapper, this.click)
},
/**
* Unbinds events attached to anchors inside a track.
*
* @return {Void}
*/
unbind () {
Binder.off('click', Components.Html.wrapper)
},
/**
* Handler for click event. Prevents clicks when glide is in `prevent` status.
*
* @param {Object} event
* @return {Void}
*/
click (event) {
event.stopPropagation()
if (prevented) {
event.preventDefault()
}
},
/**
* Detaches anchors click event inside glide.
*
* @return {self}
*/
detach () {
prevented = true
if (!detached) {
for (var i = 0; i < this.items.length; i++) {
this.items[i].draggable = false
this.items[i].setAttribute('data-href', this.items[i].getAttribute('href'))
this.items[i].removeAttribute('href')
}
detached = true
}
return this
},
/**
* Attaches anchors click events inside glide.
*
* @return {self}
*/
attach () {
prevented = false
if (detached) {
for (var i = 0; i < this.items.length; i++) {
this.items[i].draggable = true
this.items[i].setAttribute('href', this.items[i].getAttribute('data-href'))
}
detached = false
}
return this
}
}
define(Anchors, 'items', {
/**
* Gets collection of the arrows HTML elements.
*
* @return {HTMLElement[]}
*/
get () {
return Anchors._a
}
})
/**
* Detach anchors inside slides:
* - on swiping, so they won't redirect to its `href` attributes
*/
Events.on('swipe.move', () => {
Anchors.detach()
})
/**
* Attach anchors inside slides:
* - after swiping and transitions ends, so they can redirect after click again
*/
Events.on('swipe.end', () => {
Components.Transition.after(() => {
Anchors.attach()
})
})
/**
* Unbind anchors inside slides:
* - on destroying, to bring anchors to its initial state
*/
Events.on('destroy', () => {
Anchors.attach()
Anchors.unbind()
Binder.destroy()
})
return Anchors
}