UNPKG

@benmajor/jquery-touch-events

Version:

Polyfill to remove click delays and unify pointer device events.

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