@benmajor/jquery-touch-events
Version:
Polyfill to remove click delays and unify pointer device events.
2 lines (1 loc) • 15.4 kB
JavaScript
;!function(a){function o(){var a=g();a!==h&&(h=a,e.trigger("orientationchange"))}function v(b,c,d,e){var f=d.type;d.type=c,a.event.dispatch.call(b,d,e),d.type=f}a.attrFn=a.attrFn||{};var b=navigator.userAgent.toLowerCase(),c=b.indexOf("chrome")>-1&&(b.indexOf("windows")>-1||b.indexOf("macintosh")>-1||b.indexOf("linux")>-1)&&b.indexOf("mobile")<0&&b.indexOf("android")<0,d={tap_pixel_range:5,swipe_h_threshold:50,swipe_v_threshold:50,taphold_threshold:750,doubletap_int:500,touch_capable:"ontouchstart"in window&&!c,orientation_support:"orientation"in window&&"onorientationchange"in window,startevent:"ontouchstart"in window&&!c?"touchstart":"mousedown",endevent:"ontouchstart"in window&&!c?"touchend":"mouseup",moveevent:"ontouchstart"in window&&!c?"touchmove":"mousemove",tapevent:"ontouchstart"in window&&!c?"tap":"click",scrollevent:"ontouchstart"in window&&!c?"touchmove":"scroll",hold_timer:null,tap_timer:null};a.isTouchCapable=function(){return d.touch_capable},a.getStartEvent=function(){return d.startevent},a.getEndEvent=function(){return d.endevent},a.getMoveEvent=function(){return d.moveevent},a.getTapEvent=function(){return d.tapevent},a.getScrollEvent=function(){return d.scrollevent},a.each(["tapstart","tapend","tapmove","tap","tap2","tap3","tap4","singletap","doubletap","taphold","swipe","swipeup","swiperight","swipedown","swipeleft","swipeend","scrollstart","scrollend","orientationchange"],function(b,c){a.fn[c]=function(a){return a?this.on(c,a):this.trigger(c)},a.attrFn[c]=!0}),a.event.special.tapstart={setup:function(){var b=this,c=a(b);c.on(d.startevent,function a(e){if(c.data("callee",a),e.which&&1!==e.which)return!1;var f=e.originalEvent,g={position:{x:d.touch_capable?f.touches[0].screenX:e.screenX,y:d.touch_capable?f.touches[0].screenY:e.screenY},offset:{x:d.touch_capable?Math.round(f.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(e.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(f.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(e.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:e.target};return v(b,"tapstart",e,g),!0})},remove:function(){a(this).off(d.startevent,a(this).data.callee)}},a.event.special.tapmove={setup:function(){var b=this,c=a(b);c.on(d.moveevent,function a(e){c.data("callee",a);var f=e.originalEvent,g={position:{x:d.touch_capable?f.touches[0].screenX:e.screenX,y:d.touch_capable?f.touches[0].screenY:e.screenY},offset:{x:d.touch_capable?Math.round(f.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(e.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(f.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(e.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:e.target};return v(b,"tapmove",e,g),!0})},remove:function(){a(this).off(d.moveevent,a(this).data.callee)}},a.event.special.tapend={setup:function(){var b=this,c=a(b);c.on(d.endevent,function a(e){c.data("callee",a);var f=e.originalEvent,g={position:{x:d.touch_capable?f.changedTouches[0].screenX:e.screenX,y:d.touch_capable?f.changedTouches[0].screenY:e.screenY},offset:{x:d.touch_capable?Math.round(f.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(e.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(f.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(e.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:e.target};return v(b,"tapend",e,g),!0})},remove:function(){a(this).off(d.endevent,a(this).data.callee)}},a.event.special.taphold={setup:function(){var e,b=this,c=a(b),f={x:0,y:0},g=0,h=0;c.on(d.startevent,function a(i){if(i.which&&1!==i.which)return!1;c.data("tapheld",!1),e=i.target;var j=i.originalEvent,k=Date.now(),l={x:d.touch_capable?j.touches[0].screenX:i.screenX,y:d.touch_capable?j.touches[0].screenY:i.screenY},m={x:d.touch_capable?j.touches[0].pageX-j.touches[0].target.offsetLeft:i.offsetX,y:d.touch_capable?j.touches[0].pageY-j.touches[0].target.offsetTop:i.offsetY};f.x=i.originalEvent.targetTouches?i.originalEvent.targetTouches[0].pageX:i.pageX,f.y=i.originalEvent.targetTouches?i.originalEvent.targetTouches[0].pageY:i.pageY,g=f.x,h=f.y;var n=c.parent().data("threshold")?c.parent().data("threshold"):c.data("threshold"),o="undefined"!=typeof n&&n!==!1&&parseInt(n)?parseInt(n):d.taphold_threshold;return d.hold_timer=window.setTimeout(function(){var n=f.x-g,o=f.y-h;if(i.target==e&&(f.x==g&&f.y==h||n>=-d.tap_pixel_range&&n<=d.tap_pixel_range&&o>=-d.tap_pixel_range&&o<=d.tap_pixel_range)){c.data("tapheld",!0);var p=Date.now(),q={x:d.touch_capable?j.touches[0].screenX:i.screenX,y:d.touch_capable?j.touches[0].screenY:i.screenY},r={x:d.touch_capable?Math.round(j.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(i.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(j.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(i.pageY-(c.offset()?c.offset().top:0))},s=p-k,t={startTime:k,endTime:p,startPosition:l,startOffset:m,endPosition:q,endOffset:r,duration:s,target:i.target};c.data("callee1",a),v(b,"taphold",i,t)}},o),!0}).on(d.endevent,function a(){c.data("callee2",a),c.data("tapheld",!1),window.clearTimeout(d.hold_timer)}).on(d.moveevent,function a(b){c.data("callee3",a),g=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageX:b.pageX,h=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageY:b.pageY})},remove:function(){a(this).off(d.startevent,a(this).data.callee1).off(d.endevent,a(this).data.callee2).off(d.moveevent,a(this).data.callee3)}},a.event.special.doubletap={setup:function(){var e,f,h,i,b=this,c=a(b),g=null,j=!1;c.on(d.startevent,function a(b){return(!b.which||1===b.which)&&(c.data("doubletapped",!1),e=b.target,c.data("callee1",a),h=b.originalEvent,g||(g={position:{x:d.touch_capable?h.touches[0].screenX:b.screenX,y:d.touch_capable?h.touches[0].screenY:b.screenY},offset:{x:d.touch_capable?Math.round(h.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(b.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(h.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(b.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:b.target}),!0)}).on(d.endevent,function a(k){var l=Date.now(),m=c.data("lastTouch")||l+1,n=l-m;if(window.clearTimeout(f),c.data("callee2",a),n<d.doubletap_int&&k.target==e&&n>100){c.data("doubletapped",!0),window.clearTimeout(d.tap_timer);var o={position:{x:d.touch_capable?k.originalEvent.changedTouches[0].screenX:k.screenX,y:d.touch_capable?k.originalEvent.changedTouches[0].screenY:k.screenY},offset:{x:d.touch_capable?Math.round(h.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(k.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(h.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(k.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:k.target},p={firstTap:g,secondTap:o,interval:o.time-g.time};j||(v(b,"doubletap",k,p),g=null),j=!0,i=window.setTimeout(function(){j=!1},d.doubletap_int)}else c.data("lastTouch",l),f=window.setTimeout(function(){g=null,window.clearTimeout(f)},d.doubletap_int,[k]);c.data("lastTouch",l)})},remove:function(){a(this).off(d.startevent,a(this).data.callee1).off(d.endevent,a(this).data.callee2)}},a.event.special.singletap={setup:function(){var b=this,c=a(b),e=null,f=null,g={x:0,y:0};c.on(d.startevent,function a(b){return(!b.which||1===b.which)&&(f=Date.now(),e=b.target,c.data("callee1",a),g.x=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageX:b.pageX,g.y=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageY:b.pageY,!0)}).on(d.endevent,function a(h){if(c.data("callee2",a),h.target==e){var i=h.originalEvent.changedTouches?h.originalEvent.changedTouches[0].pageX:h.pageX,j=h.originalEvent.changedTouches?h.originalEvent.changedTouches[0].pageY:h.pageY;d.tap_timer=window.setTimeout(function(){var a=g.x-i,e=g.y-j;if(!c.data("doubletapped")&&!c.data("tapheld")&&(g.x==i&&g.y==j||a>=-d.tap_pixel_range&&a<=d.tap_pixel_range&&e>=-d.tap_pixel_range&&e<=d.tap_pixel_range)){var k=h.originalEvent,l={position:{x:d.touch_capable?k.changedTouches[0].screenX:h.screenX,y:d.touch_capable?k.changedTouches[0].screenY:h.screenY},offset:{x:d.touch_capable?Math.round(k.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(h.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(k.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(h.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:h.target};l.time-f<d.taphold_threshold&&v(b,"singletap",h,l)}},d.doubletap_int)}})},remove:function(){a(this).off(d.startevent,a(this).data.callee1).off(d.endevent,a(this).data.callee2)}},a.event.special.tap={setup:function(){var g,i,b=this,c=a(b),e=!1,f=null,h={x:0,y:0};c.on(d.startevent,function a(b){return c.data("callee1",a),(!b.which||1===b.which)&&(e=!0,h.x=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageX:b.pageX,h.y=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageY:b.pageY,g=Date.now(),f=b.target,i=b.originalEvent.targetTouches?b.originalEvent.targetTouches:[b],!0)}).on(d.endevent,function a(j){c.data("callee2",a);var k=j.originalEvent.targetTouches?j.originalEvent.changedTouches[0].pageX:j.pageX,l=j.originalEvent.targetTouches?j.originalEvent.changedTouches[0].pageY:j.pageY,m=h.x-k,n=h.y-l;if(f==j.target&&e&&Date.now()-g<d.taphold_threshold&&(h.x==k&&h.y==l||m>=-d.tap_pixel_range&&m<=d.tap_pixel_range&&n>=-d.tap_pixel_range&&n<=d.tap_pixel_range)){for(var p=j.originalEvent,q=[],r=0;r<i.length;r++){var s={position:{x:d.touch_capable?p.changedTouches[r].screenX:j.screenX,y:d.touch_capable?p.changedTouches[r].screenY:j.screenY},offset:{x:d.touch_capable?Math.round(p.changedTouches[r].pageX-(c.offset()?c.offset().left:0)):Math.round(j.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(p.changedTouches[r].pageY-(c.offset()?c.offset().top:0)):Math.round(j.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:j.target};q.push(s)}v(b,"tap",j,q)}})},remove:function(){a(this).off(d.startevent,a(this).data.callee1).off(d.endevent,a(this).data.callee2)}},a.event.special.swipe={setup:function(){function j(b){c=a(b.currentTarget),c.data("callee1",j),g.x=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageX:b.pageX,g.y=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageY:b.pageY,h.x=g.x,h.y=g.y,e=!0;var f=b.originalEvent;i={position:{x:d.touch_capable?f.touches[0].screenX:b.screenX,y:d.touch_capable?f.touches[0].screenY:b.screenY},offset:{x:d.touch_capable?Math.round(f.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(b.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(f.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(b.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:b.target}}function k(b){c=a(b.currentTarget),c.data("callee2",k),h.x=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageX:b.pageX,h.y=b.originalEvent.targetTouches?b.originalEvent.targetTouches[0].pageY:b.pageY;var j,l=c.parent().data("xthreshold")?c.parent().data("xthreshold"):c.data("xthreshold"),m=c.parent().data("ythreshold")?c.parent().data("ythreshold"):c.data("ythreshold"),n="undefined"!=typeof l&&l!==!1&&parseInt(l)?parseInt(l):d.swipe_h_threshold,o="undefined"!=typeof m&&m!==!1&&parseInt(m)?parseInt(m):d.swipe_v_threshold;if(g.y>h.y&&g.y-h.y>o&&(j="swipeup"),g.x<h.x&&h.x-g.x>n&&(j="swiperight"),g.y<h.y&&h.y-g.y>o&&(j="swipedown"),g.x>h.x&&g.x-h.x>n&&(j="swipeleft"),void 0!=j&&e){g.x=0,g.y=0,h.x=0,h.y=0,e=!1;var p=b.originalEvent,q={position:{x:d.touch_capable?p.touches[0].screenX:b.screenX,y:d.touch_capable?p.touches[0].screenY:b.screenY},offset:{x:d.touch_capable?Math.round(p.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(b.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(p.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(b.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:b.target},r=Math.abs(i.position.x-q.position.x),s=Math.abs(i.position.y-q.position.y),t={startEvnt:i,endEvnt:q,direction:j.replace("swipe",""),xAmount:r,yAmount:s,duration:q.time-i.time};f=!0,c.trigger("swipe",t).trigger(j,t)}}function l(b){c=a(b.currentTarget);var g="";if(c.data("callee3",l),f){var h=c.data("xthreshold"),j=c.data("ythreshold"),k="undefined"!=typeof h&&h!==!1&&parseInt(h)?parseInt(h):d.swipe_h_threshold,m="undefined"!=typeof j&&j!==!1&&parseInt(j)?parseInt(j):d.swipe_v_threshold,n=b.originalEvent,o={position:{x:d.touch_capable?n.changedTouches[0].screenX:b.screenX,y:d.touch_capable?n.changedTouches[0].screenY:b.screenY},offset:{x:d.touch_capable?Math.round(n.changedTouches[0].pageX-(c.offset()?c.offset().left:0)):Math.round(b.pageX-(c.offset()?c.offset().left:0)),y:d.touch_capable?Math.round(n.changedTouches[0].pageY-(c.offset()?c.offset().top:0)):Math.round(b.pageY-(c.offset()?c.offset().top:0))},time:Date.now(),target:b.target};i.position.y>o.position.y&&i.position.y-o.position.y>m&&(g="swipeup"),i.position.x<o.position.x&&o.position.x-i.position.x>k&&(g="swiperight"),i.position.y<o.position.y&&o.position.y-i.position.y>m&&(g="swipedown"),i.position.x>o.position.x&&i.position.x-o.position.x>k&&(g="swipeleft");var p=Math.abs(i.position.x-o.position.x),q=Math.abs(i.position.y-o.position.y),r={startEvnt:i,endEvnt:o,direction:g.replace("swipe",""),xAmount:p,yAmount:q,duration:o.time-i.time};c.trigger("swipeend",r)}e=!1,f=!1}var i,b=this,c=a(b),e=!1,f=!1,g={x:0,y:0},h={x:0,y:0};c.on(d.startevent,j),c.on(d.moveevent,k),c.on(d.endevent,l)},remove:function(){a(this).off(d.startevent,a(this).data.callee1).off(d.moveevent,a(this).data.callee2).off(d.endevent,a(this).data.callee3)}},a.event.special.scrollstart={setup:function(){function g(a,c){e=c,v(b,e?"scrollstart":"scrollend",a)}var e,f,b=this,c=a(b);c.on(d.scrollevent,function a(b){c.data("callee",a),e||g(b,!0),clearTimeout(f),f=setTimeout(function(){g(b,!1)},50)})},remove:function(){a(this).off(d.scrollevent,a(this).data.callee)}};var f,g,h,i,j,e=a(window),k={0:!0,180:!0};if(d.orientation_support){var l=window.innerWidth||e.width(),m=window.innerHeight||e.height(),n=50;i=l>m&&l-m>n,j=k[window.orientation],(i&&j||!i&&!j)&&(k={"-90":!0,90:!0})}a.event.special.orientationchange=f={setup:function(){return!d.orientation_support&&(h=g(),e.on("throttledresize",o),!0)},teardown:function(){return!d.orientation_support&&(e.off("throttledresize",o),!0)},add:function(a){var b=a.handler;a.handler=function(a){return a.orientation=g(),b.apply(this,arguments)}}},a.event.special.orientationchange.orientation=g=function(){var a=!0,b=document.documentElement;return a=d.orientation_support?k[window.orientation]:b&&b.clientWidth/b.clientHeight<1.1,a?"portrait":"landscape"},a.event.special.throttledresize={setup:function(){a(this).on("resize",q)},teardown:function(){a(this).off("resize",q)}};var s,t,u,p=250,q=function(){t=Date.now(),u=t-r,u>=p?(r=t,a(this).trigger("throttledresize")):(s&&window.clearTimeout(s),s=window.setTimeout(o,p-u))},r=0;a.each({scrollend:"scrollstart",swipeup:"swipe",swiperight:"swipe",swipedown:"swipe",swipeleft:"swipe",swipeend:"swipe",tap2:"tap"},function(b,c){a.event.special[b]={setup:function(){a(this).on(c,a.noop)}}})}(jQuery);