Something went wrong. Try again.
Utensil's technical posts in Chinese (mostly 2005-2020) utensil.tngl.sh/tech
Something went wrong. Try again.
15 kB · 83 lines
JavaScript
at site
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283/** @fileOverview TouchSwipe - jQuery Plugin* @version 1.6.3** @author Matt Bryson http://www.github.com/mattbryson* @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin* @see http://labs.skinkers.com/touchSwipe/* @see http://plugins.jquery.com/project/touchSwipe** Copyright (c) 2010 Matt Bryson* Dual licensed under the MIT or GPL Version 2 licenses.*** Changelog* $Date: 2010-12-12 (Wed, 12 Dec 2010) $* $version: 1.0.0* $version: 1.0.1 - removed multibyte comments** $Date: 2011-21-02 (Mon, 21 Feb 2011) $* $version: 1.1.0 - added allowPageScroll property to allow swiping and scrolling of page* - changed handler signatures so one handler can be used for multiple events* $Date: 2011-23-02 (Wed, 23 Feb 2011) $* $version: 1.2.0 - added click handler. This is fired if the user simply clicks and does not swipe. The event object and click target are passed to handler.* - If you use the http://code.google.com/p/jquery-ui-for-ipad-and-iphone/ plugin, you can also assign jQuery mouse events to children of a touchSwipe object.* $version: 1.2.1 - removed console log!** $version: 1.2.2 - Fixed bug where scope was not preserved in callback methods.** $Date: 2011-28-04 (Thurs, 28 April 2011) $* $version: 1.2.4 - Changed licence terms to be MIT or GPL inline with jQuery. Added check for support of touch events to stop non compatible browsers erroring.** $Date: 2011-27-09 (Tues, 27 September 2011) $* $version: 1.2.5 - Added support for testing swipes with mouse on desktop browser (thanks to https://github.com/joelhy)** $Date: 2012-14-05 (Mon, 14 May 2012) $* $version: 1.2.6 - Added timeThreshold between start and end touch, so user can ignore slow swipes (thanks to Mark Chase). Default is null, all swipes are detected** $Date: 2012-05-06 (Tues, 05 June 2012) $* $version: 1.2.7 - Changed time threshold to have null default for backwards compatibility. Added duration param passed back in events, and refactored how time is handled.** $Date: 2012-05-06 (Tues, 05 June 2012) $* $version: 1.2.8 - Added the possibility to return a value like null or false in the trigger callback. In that way we can control when the touch start/move should take effect or not (simply by returning in some cases return null; or return false;) This effects the ontouchstart/ontouchmove event.** $Date: 2012-06-06 (Wed, 06 June 2012) $* $version: 1.3.0 - Refactored whole plugin to allow for methods to be executed, as well as exposed defaults for user override. Added 'enable', 'disable', and 'destroy' methods** $Date: 2012-05-06 (Fri, 05 June 2012) $* $version: 1.3.1 - Bug fixes - bind() with false as last argument is no longer supported in jQuery 1.6, also, if you just click, the duration is now returned correctly.** $Date: 2012-29-07 (Sun, 29 July 2012) $* $version: 1.3.2 - Added fallbackToMouseEvents option to NOT capture mouse events on non touch devices.* - Added "all" fingers value to the fingers property, so any combinatin of fingers triggers the swipe, allowing event handlers to check the finger count** $Date: 2012-09-08 (Thurs, 9 Aug 2012) $* $version: 1.3.3 - Code tidy prep for minified version** $Date: 2012-04-10 (wed, 4 Oct 2012) $* $version: 1.4.0 - Added pinch support, pinchIn and pinchOut** $Date: 2012-11-10 (Thurs, 11 Oct 2012) $* $version: 1.5.0 - Added excludedElements, a jquery selector that specifies child elements that do NOT trigger swipes. By default, this is one select that removes all form, input select, button and anchor elements.** $Date: 2012-22-10 (Mon, 22 Oct 2012) $* $version: 1.5.1 - Fixed bug with jQuery 1.8 and trailing comma in excludedElements* - Fixed bug with IE and eventPreventDefault()* $Date: 2013-01-12 (Fri, 12 Jan 2013) $* $version: 1.6.0 - Fixed bugs with pinching, mainly when both pinch and swipe enabled, as well as adding time threshold for multifinger gestures, so releasing one finger beofre the other doesnt trigger as single finger gesture.* - made the demo site all static local HTML pages so they can be run locally by a developer* - added jsDoc comments and added documentation for the plugin * - code tidy* - added triggerOnTouchLeave property that will end the event when the user swipes off the element.* $Date: 2013-03-23 (Sat, 23 Mar 2013) $* $version: 1.6.1 - Added support for ie8 touch events* $version: 1.6.2 - Added support for events binding with on / off / bind in jQ for all callback names.* - Deprecated the 'click' handler in favour of tap.* - added cancelThreshold property* - added option method to update init options at runtime** $version 1.6.3 - added doubletap, longtap events and longTapThreshold, doubleTapThreshold property* $Date: 2013-04-04 (Thurs, 04 April 2013) $* $version 1.6.4 - Fixed bug with cancelThreshold introduced in 1.6.3, where swipe status no longer fired start event, and stopped once swiping back.*/!function(Rn){"use strict";function r(t){return!t||t.allowPageScroll!==undefined||t.swipe===undefined&&t.swipeStatus===undefined||(t.allowPageScroll=_n),t.click!==undefined&&t.tap===undefined&&(t.tap=t.click),t||(t={}),t=Rn.extend({},Rn.fn.swipe.defaults,t),this.each(function(){var n=Rn(this),e=n.data($n);e||(e=new i(this,t),n.data($n,e))})}function i(n,l){function e(n){if(!(_()||0<Rn(n.target).closest(l.excludedElements,bn).length)){var e,t=n.originalEvent?n.originalEvent:n,r=Kn?t.touches[0]:t;if(Sn=Gn,Kn?En=t.touches.length:n.preventDefault(),Tn=fn=null,gn=1,wn=dn=pn=hn=sn=0,On=C(),vn=F(),U(),!Kn||En===l.fingers||l.fingers===Vn||T()?(Q(0,r),xn=nn(),2==En&&(Q(1,t.touches[1]),pn=dn=G(On[0].start,On[1].start)),(l.swipeStatus||l.pinchStatus)&&(e=c(t,Sn))):e=!1,!1===e)return c(t,Sn=Jn),e;j(!0)}}function t(n){var e=n.originalEvent?n.originalEvent:n;if(Sn!==Bn&&Sn!==Jn&&!H()){var t,r=X(Kn?e.touches[0]:e);if(yn=nn(),Kn&&(En=e.touches.length),Sn=Zn,2==En&&(0==pn?(Q(1,e.touches[1]),pn=dn=G(On[0].start,On[1].start)):(X(e.touches[1]),dn=G(On[0].end,On[1].end),Tn=B(On[0].end,On[1].end)),gn=Z(pn,dn),wn=Math.abs(pn-dn)),En===l.fingers||l.fingers===Vn||!Kn||T()){if(g(n,fn=$(r.start,r.end)),sn=J(r.start,r.end),hn=z(),W(fn,sn),(l.swipeStatus||l.pinchStatus)&&(t=c(e,Sn)),!l.triggerOnTouchEnd||l.triggerOnTouchLeave){var i=!0;if(l.triggerOnTouchLeave){var u=en(this);i=tn(r.end,u)}!l.triggerOnTouchEnd&&i?Sn=o(Zn):l.triggerOnTouchLeave&&!i&&(Sn=o(Bn)),Sn!=Jn&&Sn!=Bn||c(e,Sn)}}else c(e,Sn=Jn);!1===t&&c(e,Sn=Jn)}}function r(n){var e=n.originalEvent;if(Kn&&0<e.touches.length)return N(),!0;H()&&(En=Ln),n.preventDefault(),yn=nn(),hn=z(),h()?c(e,Sn=Jn):l.triggerOnTouchEnd||0==l.triggerOnTouchEnd&&Sn===Zn?c(e,Sn=Bn):!l.triggerOnTouchEnd&&y()?s(e,Sn=Bn,Yn):Sn===Zn&&c(e,Sn=Jn),j(!1)}function i(){dn=pn=xn=yn=En=0,gn=1,U(),j(!1)}function u(n){var e=n.originalEvent;l.triggerOnTouchLeave&&c(e,Sn=o(Bn))}function a(){bn.unbind(un,e),bn.unbind(cn,i),bn.unbind(ln,t),bn.unbind(an,r),on&&bn.unbind(on,u),j(!1)}function o(n){var e=n,t=d(),r=f(),i=h();return!t||i?e=Jn:!r||n!=Zn||l.triggerOnTouchEnd&&!l.triggerOnTouchLeave?!r&&n==Bn&&l.triggerOnTouchLeave&&(e=Jn):e=Bn,e}function c(n,e){var t=undefined;return E()||S()?t=s(n,e,Qn):(v()||T())&&!1!==t&&(t=s(n,e,Xn)),A()&&!1!==t?t=s(n,e,Cn):I()&&!1!==t?t=s(n,e,Wn):k()&&!1!==t&&(t=s(n,e,Yn)),e===Jn&&i(n),e===Bn&&(Kn?0==n.touches.length&&i(n):i(n)),t}function s(n,e,t){var r=undefined;if(t==Qn){if(bn.trigger("swipeStatus",[e,fn||null,sn||0,hn||0,En]),l.swipeStatus&&!1===(r=l.swipeStatus.call(bn,n,e,fn||null,sn||0,hn||0,En)))return!1;if(e==Bn&&b()){if(bn.trigger("swipe",[fn,sn,hn,En]),l.swipe&&!1===(r=l.swipe.call(bn,n,fn,sn,hn,En)))return!1;switch(fn){case kn:bn.trigger("swipeLeft",[fn,sn,hn,En]),l.swipeLeft&&(r=l.swipeLeft.call(bn,n,fn,sn,hn,En));break;case An:bn.trigger("swipeRight",[fn,sn,hn,En]),l.swipeRight&&(r=l.swipeRight.call(bn,n,fn,sn,hn,En));break;case In:bn.trigger("swipeUp",[fn,sn,hn,En]),l.swipeUp&&(r=l.swipeUp.call(bn,n,fn,sn,hn,En));break;case Nn:bn.trigger("swipeDown",[fn,sn,hn,En]),l.swipeDown&&(r=l.swipeDown.call(bn,n,fn,sn,hn,En))}}}if(t==Xn){if(bn.trigger("pinchStatus",[e,Tn||null,wn||0,hn||0,En,gn]),l.pinchStatus&&!1===(r=l.pinchStatus.call(bn,n,e,Tn||null,wn||0,hn||0,En,gn)))return!1;if(e==Bn&&w())switch(Tn){case Un:bn.trigger("pinchIn",[Tn||null,wn||0,hn||0,En,gn]),l.pinchIn&&(r=l.pinchIn.call(bn,n,Tn||null,wn||0,hn||0,En,gn));break;case Hn:bn.trigger("pinchOut",[Tn||null,wn||0,hn||0,En,gn]),l.pinchOut&&(r=l.pinchOut.call(bn,n,Tn||null,wn||0,hn||0,En,gn))}}return t==Yn?e!==Jn&&e!==Bn||(clearTimeout(Dn),m()&&!D()?(Mn=nn(),Dn=setTimeout(Rn.proxy(function(){Mn=null,bn.trigger("tap",[n.target]),l.tap&&(r=l.tap.call(bn,n,n.target))},this),l.doubleTapThreshold)):(Mn=null,bn.trigger("tap",[n.target]),l.tap&&(r=l.tap.call(bn,n,n.target)))):t==Cn?e!==Jn&&e!==Bn||(clearTimeout(Dn),Mn=null,bn.trigger("doubletap",[n.target]),l.doubleTap&&(r=l.doubleTap.call(bn,n,n.target))):t==Wn&&(e!==Jn&&e!==Bn||(clearTimeout(Dn),Mn=null,bn.trigger("longtap",[n.target]),l.longTap&&(r=l.longTap.call(bn,n,n.target)))),r}function f(){var n=!0;return null!==l.threshold&&(n=sn>=l.threshold),n}function h(){var n=!1;return null!==l.cancelThreshold&&null!==fn&&(n=q(fn)-sn>=l.cancelThreshold),n}function p(){return null===l.pinchThreshold||wn>=l.pinchThreshold}function d(){return!l.maxTimeThreshold||!(hn>=l.maxTimeThreshold)}function g(n,e){if(l.allowPageScroll===_n||T())n.preventDefault();else{var t=l.allowPageScroll===jn;switch(e){case kn:(l.swipeLeft&&t||!t&&l.allowPageScroll!=qn)&&n.preventDefault();break;case An:(l.swipeRight&&t||!t&&l.allowPageScroll!=qn)&&n.preventDefault();break;case In:(l.swipeUp&&t||!t&&l.allowPageScroll!=Fn)&&n.preventDefault();break;case Nn:(l.swipeDown&&t||!t&&l.allowPageScroll!=Fn)&&n.preventDefault()}}}function w(){var n=O(),e=x(),t=p();return n&&e&&t}function T(){return!!(l.pinchStatus||l.pinchIn||l.pinchOut)}function v(){return!(!w()||!T())}function b(){var n=d(),e=f(),t=O(),r=x();return!h()&&r&&t&&e&&n}function S(){return!!(l.swipe||l.swipeStatus||l.swipeLeft||l.swipeRight||l.swipeUp||l.swipeDown)}function E(){return!(!b()||!S())}function O(){return En===l.fingers||l.fingers===Vn||!Kn}function x(){return 0!==On[0].end.x}function y(){return!!l.tap}function m(){return!!l.doubleTap}function L(){return!!l.longTap}function M(){if(null==Mn)return!1;var n=nn();return m()&&n-Mn<=l.doubleTapThreshold}function D(){return M()}function P(){return(1===En||!Kn)&&(isNaN(sn)||0===sn)}function R(){return hn>l.longTapThreshold&&sn<zn}function k(){return!(!P()||!y())}function A(){return!(!M()||!m())}function I(){return!(!R()||!L())}function N(){mn=nn(),Ln=event.touches.length+1}function U(){Ln=mn=0}function H(){var n=!1;mn&&(nn()-mn<=l.fingerReleaseThreshold&&(n=!0));return n}function _(){return!(!0!==bn.data($n+"_intouch"))}function j(n){!0===n?(bn.bind(ln,t),bn.bind(an,r),on&&bn.bind(on,u)):(bn.unbind(ln,t,!1),bn.unbind(an,r,!1),on&&bn.unbind(on,u,!1)),bn.data($n+"_intouch",!0===n)}function Q(n,e){var t=e.identifier!==undefined?e.identifier:0;return On[n].identifier=t,On[n].start.x=On[n].end.x=e.pageX||e.clientX,On[n].start.y=On[n].end.y=e.pageY||e.clientY,On[n]}function X(n){var e=Y(n.identifier!==undefined?n.identifier:0);return e.end.x=n.pageX||n.clientX,e.end.y=n.pageY||n.clientY,e}function Y(n){for(var e=0;e<On.length;e++)if(On[e].identifier==n)return On[e]}function C(){for(var n=[],e=0;e<=5;e++)n.push({start:{x:0,y:0},end:{x:0,y:0},identifier:0});return n}function W(n,e){e=Math.max(e,q(n)),vn[n].distance=e}function q(n){return vn[n].distance}function F(){var n={};return n[kn]=V(kn),n[An]=V(An),n[In]=V(In),n[Nn]=V(Nn),n}function V(n){return{direction:n,distance:0}}function z(){return yn-xn}function G(n,e){var t=Math.abs(n.x-e.x),r=Math.abs(n.y-e.y);return Math.round(Math.sqrt(t*t+r*r))}function Z(n,e){return(e/n*1).toFixed(2)}function B(){return gn<1?Hn:Un}function J(n,e){return Math.round(Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2)))}function K(n,e){var t=n.x-e.x,r=e.y-n.y,i=Math.atan2(r,t),u=Math.round(180*i/Math.PI);return u<0&&(u=360-Math.abs(u)),u}function $(n,e){var t=K(n,e);return t<=45&&0<=t?kn:t<=360&&315<=t?kn:135<=t&&t<=225?An:45<t&&t<135?Nn:In}function nn(){return(new Date).getTime()}function en(n){var e=(n=Rn(n)).offset();return{left:e.left,right:e.left+n.outerWidth(),top:e.top,bottom:e.top+n.outerHeight()}}function tn(n,e){return n.x>e.left&&n.x<e.right&&n.y>e.top&&n.y<e.bottom}var rn=Kn||!l.fallbackToMouseEvents,un=rn?"touchstart":"mousedown",ln=rn?"touchmove":"mousemove",an=rn?"touchend":"mouseup",on=rn?null:"mouseleave",cn="touchcancel",sn=0,fn=null,hn=0,pn=0,dn=0,gn=1,wn=0,Tn=0,vn=null,bn=Rn(n),Sn="start",En=0,On=null,xn=0,yn=0,mn=0,Ln=0,Mn=0,Dn=null;try{bn.bind(un,e),bn.bind(cn,i)}catch(Pn){Rn.error("events not supported "+un+","+cn+" on jQuery.swipe")}this.enable=function(){return bn.bind(un,e),bn.bind(cn,i),bn},this.disable=function(){return a(),bn},this.destroy=function(){return a(),bn.data($n,null),bn},this.option=function(n,e){if(l[n]!==undefined){if(e===undefined)return l[n];l[n]=e}else Rn.error("Option "+n+" does not exist on jQuery.swipe.options")}}var kn="left",An="right",In="up",Nn="down",Un="in",Hn="out",_n="none",jn="auto",Qn="swipe",Xn="pinch",Yn="tap",Cn="doubletap",Wn="longtap",qn="horizontal",Fn="vertical",Vn="all",zn=10,Gn="start",Zn="move",Bn="end",Jn="cancel",Kn="ontouchstart"in window,$n="TouchSwipe",n={fingers:1,threshold:75,cancelThreshold:null,pinchThreshold:20,maxTimeThreshold:null,fingerReleaseThreshold:250,longTapThreshold:500,doubleTapThreshold:200,swipe:null,swipeLeft:null,swipeRight:null,swipeUp:null,swipeDown:null,swipeStatus:null,pinchIn:null,pinchOut:null,pinchStatus:null,click:null,tap:null,doubleTap:null,longTap:null,triggerOnTouchEnd:!0,triggerOnTouchLeave:!1,allowPageScroll:"auto",fallbackToMouseEvents:!0,excludedElements:"button, input, select, textarea, a, .noSwipe"};Rn.fn.swipe=function(n){var e=Rn(this),t=e.data($n);if(t&&"string"==typeof n){if(t[n])return t[n].apply(this,Array.prototype.slice.call(arguments,1));Rn.error("Method "+n+" does not exist on jQuery.swipe")}else if(!(t||"object"!=typeof n&&n))return r.apply(this,arguments);return e},Rn.fn.swipe.defaults=n,Rn.fn.swipe.phases={PHASE_START:Gn,PHASE_MOVE:Zn,PHASE_END:Bn,PHASE_CANCEL:Jn},Rn.fn.swipe.directions={LEFT:kn,RIGHT:An,UP:In,DOWN:Nn,IN:Un,OUT:Hn},Rn.fn.swipe.pageScroll={NONE:_n,HORIZONTAL:qn,VERTICAL:Fn,AUTO:jn},Rn.fn.swipe.fingers={ONE:1,TWO:2,THREE:3,ALL:Vn}}(jQuery);