/* * jQuery Mobile Framework 1.1.0 db342b1f315c282692791aa870455901fdb46a55 * http://jquerymobile.com * * Copyright 2011 (c) jQuery Project * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * */ /* * Stripped the touch swipe logic from jQuery Mobile and turned it into this plugin * Copyright 2012 (c) CodingJack - http://codecanyon.net/user/CodingJack * Dual licensed under the MIT or GPL Version 2 licenses. */ /* USAGE // listen both left and right signals, the String "left" or "right" will be passed as an argument to the callback * $(element).touchSwipe(callback); // second parameter is optional and will invoke "event.stopImmediatePropagation()" // use this if you need to prevent other mouse events from firing on the same object when a swipe gesture is detected * $(element).touchSwipe(callback, true); // listen for only the left swipe event * $(element).touchSwipeLeft(callback); // listen for only the right swipe event * $(element).touchSwipeRight(callback); // unbind both left and right swipe events * $(element).unbindSwipe(); // unbind only left swipe event * $(element).unbindSwipeLeft(); // unbind only right swipe event * $(element).unbindSwipeRight(); // SPECIAL NOTES * all methods return "this" for chaining * before a plugin event is added, "unbind" is called first to make sure events are never erroneously duplicated */ ;(function($) { var touchStopEvent, touchMoveEvent, touchStartEvent, horizontalDistanceThreshold = 30, verticalDistanceThreshold = 75, scrollSupressionThreshold = 10, durationThreshold = 1000; if("ontouchend" in document) { touchStopEvent = "touchend.cj_swp"; touchMoveEvent = "touchmove.cj_swp"; touchStartEvent = "touchstart.cj_swp"; } else { touchStopEvent = "mouseup.cj_swp"; touchMoveEvent = "mousemove.cj_swp"; touchStartEvent = "mousedown.cj_swp"; } $.fn.touchSwipe = function(cb, prevent) { if(prevent) this.data("stopPropagation", true); if(cb) return this.each(swipeBoth, [cb]); } $.fn.touchSwipeLeft = function(cb, prevent) { if(prevent) this.data("stopPropagation", true); if(cb) return this.each(swipeLeft , [cb]); } $.fn.touchSwipeRight = function(cb, prevent) { if(prevent) this.data("stopPropagation", true); if(cb) return this.each(swipeRight, [cb]); } function swipeBoth(cb) { $(this).touchSwipeLeft(cb).touchSwipeRight(cb); } function swipeLeft(cb) { var $this = $(this); if(!$this.data("swipeLeft")) $this.data("swipeLeft", cb); if(!$this.data("swipeRight")) addSwipe($this); } function swipeRight(cb) { var $this = $(this); if(!$this.data("swipeRight")) $this.data("swipeRight", cb); if(!$this.data("swipeLeft")) addSwipe($this); } $.fn.unbindSwipeLeft = function() { this.removeData("swipeLeft"); if(!this.data("swipeRight")) this.unbindSwipe(true); } $.fn.unbindSwipeRight = function() { this.removeData("swipeRight"); if(!this.data("swipeLeft")) this.unbindSwipe(true); } $.fn.unbindSwipe = function(changeData) { if(!changeData) this.removeData("swipeLeft swipeRight stopPropagation"); return this.unbind(touchStartEvent + " " + touchMoveEvent + " " + touchStopEvent); } function addSwipe($this) { $this.unbindSwipe(true).bind(touchStartEvent, touchStart); } function touchStart(event) { var time = new Date().getTime(), data = event.originalEvent.touches ? event.originalEvent.touches[0] : event, $this = $(this).bind(touchMoveEvent, moveHandler).one(touchStopEvent, touchEnded), pageX = data.pageX, pageY = data.pageY, newPageX, newPageY, newTime; if($this.data("stopPropagation")) event.stopImmediatePropagation(); function touchEnded(event) { $this.unbind(touchMoveEvent); if(time && newTime) { if(newTime - time < durationThreshold && Math.abs(pageX - newPageX) > horizontalDistanceThreshold && Math.abs(pageY - newPageY) < verticalDistanceThreshold) { if(pageX > newPageX) { if($this.data("swipeLeft")) $this.data("swipeLeft")("left"); } else { if($this.data("swipeRight")) $this.data("swipeRight")("right"); } } } time = newTime = null; } function moveHandler(event) { if(time) { data = event.originalEvent.touches ? event.originalEvent.touches[0] : event; newTime = new Date().getTime(); newPageX = data.pageX; newPageY = data.pageY; if(Math.abs(pageX - newPageX) > scrollSupressionThreshold) event.preventDefault(); } } } })(jQuery);