$.fn.extend( { touch : function(options) { var settings = { handleTouch : null, north : null, northeast : null, east : null, southeast : null, south : null, southwest : null, west : null, northwest : null, minXDist : 10, minYDist : 10, relayVertScroll : true }; if (options) $.extend(settings, options); return this.each( function() { var me = $(this); var node = document.getElementById(me.attr('id')); var startX = 0; var startY = 0; var endX = 0; var endY = 0; var moved = false; node.ontouchstart = start; node.ontouchmove = move; node.ontouchend = end; function start(evt) { if (evt.changedTouches.length == 1) { var touch = evt.targetTouches[0]; startX = touch.pageX; startY = touch.pageY; } //evt.preventDefault(); } function move(evt) { if (evt.changedTouches.length == 1) { moved = true; var touch = evt.changedTouches[0]; currX = touch.pageX; currY = touch.pageY; if(settings.relayVertScroll) { dX = Math.abs(currX - startX); dY = Math.abs(currY - startY); if(dX > 10) evt.preventDefault(); } } //evt.preventDefault(); } function end(evt) { //evt.preventDefault(); if (evt.changedTouches.length == 1 && moved) { var touch = evt.changedTouches[0]; endX = touch.pageX; endY = touch.pageY; if (settings.handleTouch) { settings.handleTouch(startX, startY, endX, endY); evt.preventDefault(); } if(settings.north && (startY-endY) > settings.minYDist) { settings.north(me); evt.preventDefault(); } if(settings.northeast && (startY-endY) > settings.minYDist && (endX-startX) > settings.minXDist) { settings.northeast(me); evt.preventDefault(); } if(settings.east && (endX-startX) > settings.minXDist) { settings.east(me); evt.preventDefault(); } if(settings.southeast && (endX-startX) > settings.minXDist && (endY-startY) > settings.minYDist) { settings.southeast(me); evt.preventDefault(); } if(settings.south && (endY-startY) > settings.minYDist) { settings.south(me); evt.preventDefault(); } if(settings.southwest && (endY-startY) > settings.minYDist && (startX-endX) > settings.minXDist) { settings.southwest(me); evt.preventDefault(); } if(settings.west && (startX-endX) > settings.minXDist) { settings.west(me); evt.preventDefault(); } if(settings.northwest && (startY-endY) > settings.minYDist && (startX-endX) > settings.minXDist) { settings.northwest(me); } } } }); } });