Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 103 additions & 38 deletions swipe.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
(function (factory) {
// Support three module loading scenarios
if (typeof define === 'function' && define['amd']) {
// [1] AMD swipe module
define("swipe", ['exports', 'require'], factory);
} else if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
// [2] CommonJS/Node.js
factory(module['exports'] || exports); // module.exports is for Node.js
} else {
// [3] No module loader (plain <script> tag) - put directly in global namespace
factory(window);
}
}(function (exports, amdRequire) {
/*
* Swipe 2.0
*
Expand Down Expand Up @@ -32,6 +45,7 @@ function Swipe(container, options) {
options = options || {};
var index = parseInt(options.startSlide, 10) || 0;
var speed = options.speed || 300;
var slideWidth = options.slideWidth || 0;
options.continuous = options.continuous !== undefined ? options.continuous : true;

function setup() {
Expand All @@ -54,7 +68,15 @@ function Swipe(container, options) {
slidePos = new Array(slides.length);

// determine width of each slide
width = container.getBoundingClientRect().width || container.offsetWidth || $("body").width();
width = container.getBoundingClientRect().width || container.offsetWidth;
if (width <= 0 || width == null) {
if (jQuery != undefined) {
width = jQuery(container).width();
}
}

width = width || slideWidth || $("body").width();

element.style.width = (slides.length * width) + 'px';

Expand Down Expand Up @@ -234,27 +256,34 @@ function Swipe(container, options) {
var start = {};
var delta = {};
var isScrolling;
var enabled = !options.disableTouch || true;
var distance = options.breakDistance || null;

// setup event capturing
var events = {

enabled : !options.disableTouch || true,
handleEvent: function(event) {

switch (event.type) {
case 'touchstart': this.start(event); break;
case 'touchmove': this.move(event); break;
case 'touchend': offloadFn(this.end(event)); break;
case 'touchend': events.enabled && offloadFn(this.end(event)); break;
case 'scroll': this.scroll(event); break;
case 'webkitTransitionEnd':
case 'msTransitionEnd':
case 'oTransitionEnd':
case 'otransitionend':
case 'transitionend': offloadFn(this.transitionEnd(event)); break;
case 'resize': offloadFn(setup); break;
case 'transitionend': events.enabled && offloadFn(this.transitionEnd(event)); break;
case 'resize': events.enabled && offloadFn(setup); break;
}

if (options.stopPropagation) event.stopPropagation();
if (options.stopPropagation || !enabled) event.stopPropagation();

},
scroll: function(event) {
container.scrollLeft = 0;
},
start: function(event) {

var touches = event.touches[0];
Expand Down Expand Up @@ -307,6 +336,22 @@ function Swipe(container, options) {

// prevent native scrolling
event.preventDefault();
if (!events.enabled) return;

if (distance != null)
{
if (delta.x > distance) {
delta.x = (width / 2) + 10;
this.end(event);
return;
}

if (delta.x < -distance) {
delta.x = -(width / 2) - 10;
this.end(event);
return;
}
}

// stop slideshow
stop();
Expand Down Expand Up @@ -396,7 +441,7 @@ function Swipe(container, options) {
}

options.callback && options.callback(index, slides[index]);

container.scrollLeft = 0;
} else {

if (options.continuous) {
Expand Down Expand Up @@ -428,7 +473,7 @@ function Swipe(container, options) {
if (delay) begin();

options.transitionEnd && options.transitionEnd.call(event, index, slides[index]);

container.scrollLeft = 0;
}

}
Expand All @@ -441,30 +486,51 @@ function Swipe(container, options) {
// start auto slideshow if applicable
if (delay) begin();

function attachEventHandlers()
{
if (browser.addEventListener) {

// add event listeners
if (browser.addEventListener) {
// set touchstart event on element
if (browser.touch) element.addEventListener('touchstart', events, false);

// set touchstart event on element
if (browser.touch) element.addEventListener('touchstart', events, false);
if (browser.transitions) {
element.addEventListener('webkitTransitionEnd', events, false);
element.addEventListener('msTransitionEnd', events, false);
element.addEventListener('oTransitionEnd', events, false);
element.addEventListener('otransitionend', events, false);
element.addEventListener('transitionend', events, false);
}

if (browser.transitions) {
element.addEventListener('webkitTransitionEnd', events, false);
element.addEventListener('msTransitionEnd', events, false);
element.addEventListener('oTransitionEnd', events, false);
element.addEventListener('otransitionend', events, false);
element.addEventListener('transitionend', events, false);
// set resize event on window
window.addEventListener('resize', events, false);

} else {
window.onresize = function () { setup() }; // to play nice with old IE
}
}
function detachEventHandler() {
if (browser.addEventListener) {

// set resize event on window
window.addEventListener('resize', events, false);
// remove current event listeners
element.removeEventListener('touchstart', events, false);
element.removeEventListener('webkitTransitionEnd', events, false);
element.removeEventListener('msTransitionEnd', events, false);
element.removeEventListener('oTransitionEnd', events, false);
element.removeEventListener('otransitionend', events, false);
element.removeEventListener('transitionend', events, false);
window.removeEventListener('resize', events, false);

} else {
}
else {

window.onresize = function () { setup() }; // to play nice with old IE
window.onresize = null;

}
}

// add event listeners
attachEventHandlers();

// expose the Swipe API
return {
setup: function() {
Expand Down Expand Up @@ -535,24 +601,19 @@ function Swipe(container, options) {
}

// removed event listeners
if (browser.addEventListener) {

// remove current event listeners
element.removeEventListener('touchstart', events, false);
element.removeEventListener('webkitTransitionEnd', events, false);
element.removeEventListener('msTransitionEnd', events, false);
element.removeEventListener('oTransitionEnd', events, false);
element.removeEventListener('otransitionend', events, false);
element.removeEventListener('transitionend', events, false);
window.removeEventListener('resize', events, false);

}
else {

window.onresize = null;

}

detachEventHandler();
},
enable: function(value) {
events.enabled = value;
},
getEnabled: function () {
return events.enabled;
},
attachEvents: function () {
attachEventHandlers();
},
detachEvents: function () {
detachEventHandler();
}
}

Expand All @@ -568,3 +629,7 @@ if ( window.jQuery || window.Zepto ) {
}
})( window.jQuery || window.Zepto )
}

exports.Swipe = Swipe;
return Swipe;
}));