webui-aria2/js/libs/dojox/gesture/tap.js.uncompressed.js
2012-05-01 19:52:07 +08:00

145 lines
4.1 KiB
JavaScript

//>>built
define("dojox/gesture/tap", [
"dojo/_base/kernel",
"dojo/_base/declare",
"dojo/_base/lang",
"./Base",
"../main"
], function(kernel, declare, lang, Base, dojox){
// module:
// dojox/gesture/tap
/*=====
dojox.gesture.tap = {
// summary:
// This module provides tap gesture event handlers:
//
// 1. dojox.gesture.tap: 'tap' event
//
// 2. dojox.gesture.tap.hold: 'tap.hold' event
//
// 3. dojox.gesture.tap.doubletap: 'tap.doubletap' event
//
// example:
// A. Used with dojo.connect()
// | dojo.connect(node, dojox.gesture.tap, function(e){});
// | dojo.connect(node, dojox.gesture.tap.hold, function(e){});
// | dojo.connect(node, dojox.gesture.tap.doubletap, function(e){});
//
// B. Used with dojo.on
// | define(['dojo/on', 'dojox/gesture/tap'], function(on, tap){
// | on(node, tap, function(e){});
// | on(node, tap.hold, function(e){});
// | on(node, tap.doubletap, function(e){});
//
// C. Used with dojox.gesture.tap.* directly
// | dojox.gesture.tap(node, function(e){});
// | dojox.gesture.tap.hold(node, function(e){});
// | dojox.gesture.tap.doubletap(node, function(e){});
//
// Though there is always a default gesture instance after being required, e.g
// | require(['dojox/gesture/tap'], function(){...});
//
// It's possible to create a new one with different parameter setting:
// | var myTap = new dojox.gesture.tap.Tap({holdThreshold: 300});
// | dojo.connect(node, myTap, function(e){});
// | dojo.connect(node, myTap.hold, function(e){});
// | dojo.connect(node, myTap.doubletap, function(e){});
};
=====*/
kernel.experimental("dojox.gesture.tap");
// Declare an internal anonymous class which will only be exported
// by module return value e.g. dojox.gesture.tap.Tap
var clz = declare(/*===== "dojox.gesture.tap", =====*/Base, {
// defaultEvent: [readonly] String
// Default event - 'tap'
defaultEvent: "tap",
// subEvents: [readonly] Array
// List of sub events, used by being
// combined with defaultEvent as 'tap.hold', 'tap.doubletap'.
subEvents: ["hold", "doubletap"],
// holdThreshold: Integer
// Threshold(in milliseconds) for 'tap.hold'
holdThreshold: 500,
// holdThreshold: Integer
// Timeout (in milliseconds) for 'tap.doubletap'
doubleTapTimeout: 250,
// tapRadius: Integer
// Valid tap radius from previous touch point
tapRadius: 10,
press: function(/*Object*/data, /*Event*/e){
// summary:
// Overwritten, record initial tap info and register a timeout checker for 'tap.hold'
if(e.touches && e.touches.length >= 2){
//tap gesture is only for single touch
delete data.context;
return;
}
var target = e.target;
this._initTap(data, e);
data.tapTimeOut = setTimeout(lang.hitch(this, function(){
if(this._isTap(data, e)){
this.fire(target, {type: "tap.hold"});
}
delete data.context;
}), this.holdThreshold);
},
release: function(/*Object*/data, /*Event*/e){
// summary:
// Overwritten, fire matched 'tap' or 'tap.doubletap' during touchend
if(!data.context){
clearTimeout(data.tapTimeOut);
return;
}
if(this._isTap(data, e)){
switch(data.context.c){
case 1:
this.fire(e.target, {type: "tap"});
break;
case 2:
this.fire(e.target, {type: "tap.doubletap"});
break;
}
}
clearTimeout(data.tapTimeOut);
},
_initTap: function(/*Object*/data, /*Event*/e){
// summary:
// Update the gesture data with new tap info
if(!data.context){
data.context = {x: 0, y: 0, t: 0, c: 0};
}
var ct = new Date().getTime();
if(ct - data.context.t <= this.doubleTapTimeout){
data.context.c++;
}else{
data.context.c = 1;
data.context.x = e.screenX;
data.context.y = e.screenY;
}
data.context.t = ct;
},
_isTap: function(/*Object*/data, /*Event*/e){
// summary:
// Check whether it's an valid tap
var dx = Math.abs(data.context.x - e.screenX);
var dy = Math.abs(data.context.y - e.screenY);
return dx <= this.tapRadius && dy <= this.tapRadius;
}
});
// the default tap instance for handy use
dojox.gesture.tap = new clz();
// Class for creating a new Tap instance
dojox.gesture.tap.Tap = clz;
return dojox.gesture.tap;
});