1 |
- (function(){function h(i){return Math.sqrt(i.x*i.x+i.y*i.y)}function b(j,i){return j.x*i.x+j.y*i.y}function c(l,k){var i=h(l)*h(k);if(i===0){return 0}var j=b(l,k)/i;if(j>1){j=1}return Math.acos(j)}function g(j,i){return j.x*i.y-i.x*j.y}function d(k,j){var i=c(k,j);if(g(k,j)>0){i*=-1}return i*180/Math.PI}var f=function(i){this.handlers=[];this.el=i};f.prototype.add=function(i){this.handlers.push(i)};f.prototype.del=function(k){if(!k){this.handlers=[]}for(var j=this.handlers.length;j>=0;j--){if(this.handlers[j]===k){this.handlers.splice(j,1)}}};f.prototype.dispatch=function(){for(var k=0,j=this.handlers.length;k<j;k++){var l=this.handlers[k];if(typeof l==="function"){l.apply(this.el,arguments)}}};function a(j,i){var k=new f(j);k.add(i);return k}var e=function(j,i){this.element=typeof j=="string"?document.querySelector(j):j;this.start=this.start.bind(this);this.move=this.move.bind(this);this.end=this.end.bind(this);this.cancel=this.cancel.bind(this);this.element.addEventListener("touchstart",this.start,false);this.element.addEventListener("touchmove",this.move,false);this.element.addEventListener("touchend",this.end,false);this.element.addEventListener("touchcancel",this.cancel,false);this.preV={x:null,y:null};this.pinchStartLen=null;this.zoom=1;this.isDoubleTap=false;var k=function(){};this.rotate=a(this.element,i.rotate||k);this.touchStart=a(this.element,i.touchStart||k);this.multipointStart=a(this.element,i.multipointStart||k);this.multipointEnd=a(this.element,i.multipointEnd||k);this.pinch=a(this.element,i.pinch||k);this.swipe=a(this.element,i.swipe||k);this.tap=a(this.element,i.tap||k);this.doubleTap=a(this.element,i.doubleTap||k);this.longTap=a(this.element,i.longTap||k);this.singleTap=a(this.element,i.singleTap||k);this.pressMove=a(this.element,i.pressMove||k);this.twoFingerPressMove=a(this.element,i.twoFingerPressMove||k);this.touchMove=a(this.element,i.touchMove||k);this.touchEnd=a(this.element,i.touchEnd||k);this.touchCancel=a(this.element,i.touchCancel||k);this._cancelAllHandler=this.cancelAll.bind(this);window.addEventListener("scroll",this._cancelAllHandler);this.delta=null;this.last=null;this.now=null;this.tapTimeout=null;this.singleTapTimeout=null;this.longTapTimeout=null;this.swipeTimeout=null;this.x1=this.x2=this.y1=this.y2=null;this.preTapPosition={x:null,y:null}};e.prototype={start:function(j){if(!j.touches){return}this.now=Date.now();this.x1=j.touches[0].pageX;this.y1=j.touches[0].pageY;this.delta=this.now-(this.last||this.now);this.touchStart.dispatch(j,this.element);if(this.preTapPosition.x!==null){this.isDoubleTap=(this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30);if(this.isDoubleTap){clearTimeout(this.singleTapTimeout)}}this.preTapPosition.x=this.x1;this.preTapPosition.y=this.y1;this.last=this.now;var l=this.preV,i=j.touches.length;if(i>1){this._cancelLongTap();this._cancelSingleTap();var k={x:j.touches[1].pageX-this.x1,y:j.touches[1].pageY-this.y1};l.x=k.x;l.y=k.y;this.pinchStartLen=h(l);this.multipointStart.dispatch(j,this.element)}this._preventTap=false;this.longTapTimeout=setTimeout(function(){this.longTap.dispatch(j,this.element);this._preventTap=true}.bind(this),750)},move:function(r){if(!r.touches){return}var p=this.preV,m=r.touches.length,j=r.touches[0].pageX,i=r.touches[0].pageY;this.isDoubleTap=false;if(m>1){var o=r.touches[1].pageX,n=r.touches[1].pageY;var q={x:r.touches[1].pageX-j,y:r.touches[1].pageY-i};if(p.x!==null){if(this.pinchStartLen>0){r.zoom=h(q)/this.pinchStartLen;this.pinch.dispatch(r,this.element)}r.angle=d(q,p);this.rotate.dispatch(r,this.element)}p.x=q.x;p.y=q.y;if(this.x2!==null&&this.sx2!==null){r.deltaX=(j-this.x2+o-this.sx2)/2;r.deltaY=(i-this.y2+n-this.sy2)/2}else{r.deltaX=0;r.deltaY=0}this.twoFingerPressMove.dispatch(r,this.element);this.sx2=o;this.sy2=n}else{if(this.x2!==null){r.deltaX=j-this.x2;r.deltaY=i-this.y2;var l=Math.abs(this.x1-this.x2),k=Math.abs(this.y1-this.y2);if(l>10||k>10){this._preventTap=true}}else{r.deltaX=0;r.deltaY=0}this.pressMove.dispatch(r,this.element)}this.touchMove.dispatch(r,this.element);this._cancelLongTap();this.x2=j;this.y2=i;if(m>1){r.preventDefault()}},end:function(i){if(!i.changedTouches){return}this._cancelLongTap();var j=this;if(i.touches.length<2){this.multipointEnd.dispatch(i,this.element);this.sx2=this.sy2=null}if((this.x2&&Math.abs(this.x1-this.x2)>30)||(this.y2&&Math.abs(this.y1-this.y2)>30)){i.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2);this.swipeTimeout=setTimeout(function(){j.swipe.dispatch(i,j.element)},0)}else{this.tapTimeout=setTimeout(function(){if(!j._preventTap){j.tap.dispatch(i,j.element)}if(j.isDoubleTap){j.doubleTap.dispatch(i,j.element);j.isDoubleTap=false}},0);if(!j.isDoubleTap){j.singleTapTimeout=setTimeout(function(){j.singleTap.dispatch(i,j.element)},250)}}this.touchEnd.dispatch(i,this.element);this.preV.x=0;this.preV.y=0;this.zoom=1;this.pinchStartLen=null;this.x1=this.x2=this.y1=this.y2=null},cancelAll:function(){this._preventTap=true;clearTimeout(this.singleTapTimeout);clearTimeout(this.tapTimeout);clearTimeout(this.longTapTimeout);clearTimeout(this.swipeTimeout)},cancel:function(i){this.cancelAll();this.touchCancel.dispatch(i,this.element)},_cancelLongTap:function(){clearTimeout(this.longTapTimeout)},_cancelSingleTap:function(){clearTimeout(this.singleTapTimeout)},_swipeDirection:function(j,i,l,k){return Math.abs(j-i)>=Math.abs(l-k)?(j-i>0?"Left":"Right"):(l-k>0?"Up":"Down")},on:function(i,j){if(this[i]){this[i].add(j)}},off:function(i,j){if(this[i]){this[i].del(j)}},destroy:function(){if(this.singleTapTimeout){clearTimeout(this.singleTapTimeout)}if(this.tapTimeout){clearTimeout(this.tapTimeout)}if(this.longTapTimeout){clearTimeout(this.longTapTimeout)}if(this.swipeTimeout){clearTimeout(this.swipeTimeout)}this.element.removeEventListener("touchstart",this.start);this.element.removeEventListener("touchmove",this.move);this.element.removeEventListener("touchend",this.end);this.element.removeEventListener("touchcancel",this.cancel);this.rotate.del();this.touchStart.del();this.multipointStart.del();this.multipointEnd.del();this.pinch.del();this.swipe.del();this.tap.del();this.doubleTap.del();this.longTap.del();this.singleTap.del();this.pressMove.del();this.twoFingerPressMove.del();this.touchMove.del();this.touchEnd.del();this.touchCancel.del();this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null;window.removeEventListener("scroll",this._cancelAllHandler);return null}};if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=e}else{window.AlloyFinger=e}})();
|