-
-
Save eristoddle/5011106 to your computer and use it in GitHub Desktop.
Add Swipe to Drupal Views Slideshow and jQuery Cycle
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Drupal.settings.isTouchDevice = function() { | |
return "ontouchstart" in window; | |
} | |
if ( Drupal.settings.isTouchDevice() ) { | |
Drupal.behaviors.jQueryMobileSlideShowTouchAdvance = { | |
attach: function(context, settings) { | |
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance; | |
jQuery.each(jQuery(".views_slideshow_cycle_main.viewsSlideshowCycle-processed"), function(idx, value) { | |
value.addEventListener("touchstart", self.handleTouchStart); | |
jQuery(value).addClass("views-slideshow-mobile-processed"); | |
}) | |
jQuery(self).bind("swipe", self.handleSwipe); | |
}, | |
detach: function() { }, original: { x: 0, y: 0}, | |
changed: { x: 0, y: 0}, direction: { x: "", y: "" }, fired: false, | |
handleTouchStart: function(evt) { | |
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance; | |
if (evt.touches) { | |
if (evt.targetTouches.length != 1) { return false; } // don't respond to gestures | |
if (evt.touches.length) { evt.preventDefault(); evt.stopPropagation() } | |
self.original = { x: evt.touches[0].clientX, y: evt.touches[0].clientY } | |
self.target = jQuery(this).attr("id").replace("views_slideshow_cycle_main_", ""); | |
Drupal.viewsSlideshow.action({ "action": "pause", "slideshowID": self.target }); | |
evt.target.addEventListener("touchmove", self.handleTouchMove); | |
evt.target.addEventListener("touchend", self.handleTouchEnd); | |
} | |
}, | |
handleTouchMove: function(evt) { | |
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance; | |
self.changed = { | |
x: (evt.touches.length) ? evt.touches[0].clientX: evt.changedTouches[0].clientX, | |
y: (evt.touches.length) ? evt.touches[0].clientY: evt.changedTouches[0].clientY | |
}; | |
h = parseInt(self.original.x - self.changed.x), v = parseInt(self.original.y - self.changed.y); | |
if (h !== 0) { self.direction.x = (h < 0) ? "right":"left"; } | |
if (v !== 0) { self.direction.y = (v < 0) ? "up": "down"; } | |
if ((h+v) != 0) { | |
jQuery(self).trigger("swipe"); | |
} | |
}, | |
handleTouchEnd: function(evt) { | |
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance; | |
evt.target.removeEventListener("touchmove", self.handleTouchMove); | |
evt.target.removeEventListener("touchend", self.handleTouchEnd); | |
self.fired = false; | |
}, | |
handleSwipe: function(evt) { | |
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance; | |
if (evt != undefined && self.fired == false) { | |
Drupal.viewsSlideshow.action({ "action": (self.direction.x == "left")?"nextSlide":"previousSlide", "slideshowID": self.target }); | |
self.fired = true; //only fire advance once per touch | |
} | |
} | |
} | |
} |
I've modify a bit the js to:
- Allow a distance between the start and end points.
- Avoid the usage of preventDefault and StopPropagation to allow native slideshow behaviour (eg. click).
- Avoid vertical swipe to allow default device scrolling.
/** Swipe behavior for Views Slideshows. */
Drupal.settings.isTouchDevice = function() {
return "ontouchstart" in window;
}
if ( Drupal.settings.isTouchDevice() ) {
Drupal.behaviors.jQueryMobileSlideShowTouchAdvance = {
attach: function(context, settings) {
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
jQuery.each(jQuery(".views_slideshow_cycle_main.viewsSlideshowCycle-processed"), function(idx, value) {
value.addEventListener("touchstart", self.handleTouchStart);
jQuery(value).addClass("views-slideshow-mobile-processed");
})
jQuery(self).bind("swipe", self.handleSwipe);
},
detach: function() { },
original: { x: 0, y: 0},
changed: { x: 0, y: 0},
direction: { x: "", y: "" },
fired: false,
ratio: 25,
handleTouchStart: function(evt) {
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
if (evt.touches) {
if (evt.targetTouches.length != 1) { return false; } // don't respond to gestures
self.original = { x: evt.touches[0].clientX, y: evt.touches[0].clientY }
self.target = jQuery(this).attr("id").replace("views_slideshow_cycle_main_", "");
Drupal.viewsSlideshow.action({ "action": "pause", "slideshowID": self.target });
evt.target.addEventListener("touchmove", self.handleTouchMove);
evt.target.addEventListener("touchend", self.handleTouchEnd);
}
},
handleTouchMove: function(evt) {
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
self.changed = {
x: (evt.touches.length) ? evt.touches[0].clientX: evt.changedTouches[0].clientX,
y: (evt.touches.length) ? evt.touches[0].clientY: evt.changedTouches[0].clientY
};
h = parseInt(self.original.x - self.changed.x),
v = parseInt(self.original.y - self.changed.y);
if (h !== 0) { self.direction.x = (h < self.ratio) ? "right":"left"; }
if (v !== 0) { self.direction.y = (v < self.ratio) ? "up": "down"; }
if (h > self.ratio || h < self.ratio*-1) {
jQuery(self).trigger("swipe");
}
},
handleTouchEnd: function(evt) {
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
evt.target.removeEventListener("touchmove", self.handleTouchMove);
evt.target.removeEventListener("touchend", self.handleTouchEnd);
self.fired = false;
},
handleSwipe: function(evt) {
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
if (evt != undefined && self.fired == false) {
Drupal.viewsSlideshow.action({ "action": (self.direction.x == "left")?"nextSlide":"previousSlide", "slideshowID": self.target });
self.fired = true; //only fire advance once per touch
}
}
}
}
You could modify the "ratio" property to extend or contract the distance.
Hope this helps somebody. :)
You can integrate touch or swipe control by integrating a simple JS plugin and activating a "click" on the controls. Here's a tutorial to Drupal touch slider or swiper with Views Slideshow. It's only a few lines of code.
Replace lines
self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
by
var self = Drupal.behaviors.jQueryMobileSlideShowTouchAdvance;
.
Overwise the global Variable self
is changed which usually refers to the browser window, which may break other JavaScript code. In my case it broke JavaScript code from module ShareThis.
Works well, thanks!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It didn't work for us either. :-/